Mongodb聚合阵列分区和计数



我有一个mongodb聚合问题,我还没有设法解决。到目前为止,在我的聚合中,我有一个过滤器,一个$project和一个$accumulator使用javascript函数,该函数成功地将数据减少到像这样的数组数组:[[a,B], [a, C], [a,B, [C, D],…]. 这些值A,B等等……是具有4或5个键的对象&代表人的值,以及[A, B]对表示人与人之间的关系。这个列表非常长,并且在一些-甚至不是非常大-查询中,mongodb的16MB限制用于生成BSON以返回。

我可以使用$setIntersection来减少列表的大小,所以它的工作,但我真正想要能够做的是减少列表的唯一值包含在它与计数每个唯一值。这可以用几种方式表示,但为了说明它,我可能想要这样的结构:[[[A, B], 2], [[A, C], 1], [[C, D], 1]],…].

有谁能给我一些建议吗?我试了好几种方法,但都没用。如果javascript在我的mongo(4.4.1)中实现了对象哈希和集合,那么我可以很容易地在我的累加器中实现它;但事实并非如此。我想我可以编写自己的哈希/集实现,但这似乎有点小题大做。我还没有设法找到使用聚合管道操作符的机制。我想那是最好的办法,但我不确定……

根据要求,这里有一些关于数据的更多细节。过滤器阶段返回的数据是这样的(显然非常总结,Bob, Mark等)。是对象):

[
{
…
users: [
Bob,
Mary.
Mark
] 
…
},
{
…
users: [
Andrew,
Mary,
Mark
] 
…
}.
{
…
users: [
Bob,
Mark
] 
…
}
]

处理的第一阶段(我已经在$Accumulator中完成))是,对于每条记录,获得用户A ->用户B关系,如下所示(每条记录一行):

[
[Bob, Mary], [Bob, Mark], [Mary, Bob], [Mary, Mark], [Mark, Bob], [Mark, Mary],
[Andrew, Mary], [Andrew, Mark], [Mary, Andrew], [Mary, Mark], [Mark, Andrew], [Mark, Mary],
[Bob, Mark], [Mark, Bob]
]

但是这个列表很长。我想总结一下,找到唯一的对,并计算它们,得到这样的结果。好了,我已经把它写成数组了但它也可以是其他形式也有同样的含义:

[
[[Bob, Mary], 1],
[[Bob, Mark], 2],
[[Mary, Bob], 1],
[[Mary, Mark], 2],
[[Mark, Bob], 2],
[[Mark, Mary], 2],
[[Andrew, Mary], 1],
[[Andrew, Mark], 1],
[[Mary, Andrew], 1],
[[Mark, Andrew], 1],
]

我希望这能澄清一些事情。当然,可能会有一种完全不同的方法来做这件事。我愿意接受任何最好的方法!

  • $setUnion从数组中获取唯一元素
  • $map迭代上述唯一元素的循环
  • $filter迭代数组循环获取匹配元素
  • $size获得以上过滤结果计数
db.collection.aggregate([
{
$project: {
field: {
$map: {
input: { $setUnion: "$field" },
in: [
"$$this",
{
$size: {
$filter: {
input: "$field",
as: "a",
cond: { $eq: ["$$this", "$$a"] }
}
}
}
]
}
}
}
}
])

游乐场

最新更新