我收集了这些文件:
[
{p: [1, 2, 3, 4]},
{p: [1, 2, 7, 9, 10]},
{p: [3, 5]}
]
我想知道所有文档中p
的每个元素出现在其他文档p
中的次数。正确的结果应该是这些元素的收集:
[
{pElement: 1, count: 2},
{pElement: 2, count: 2},
{pElement: 3, count: 2},
{pElement: 4, count: 1},
{pElement: 7, count: 1},
{pElement: 9, count: 1},
{pElement: 10, count: 1},
{pElement: 5, count: 1}
]
我怎样才能做到这一点?
答案 0 :(得分:1)
您应该使用具有以下阶段的Aggregation Pipeline:
p
数组并为每个元素生成一个文档。您可以使用$unwind
运算符来执行此操作。p
值对生成的文档进行分组,并使用$group
运算符和$sum
累加器运算符计算每个文档的出现次数。$project
运算符将前一阶段结果重塑为{pElement: p, count: c}
。$sort
运算符根据count
值对其进行排序。最终聚合代码如下所示:
db.collectionName.aggregate([
{ $unwind: "$p" },
{ $group: { _id: "$p", count: { $sum: 1 } } },
{ $project: { _id: 0, pElement: "$_id", count: 1 } },
{ $sort: { count: -1 } }
])
结果将是:
{ "count" : 2, "pElement" : 3 }
{ "count" : 2, "pElement" : 2 }
{ "count" : 2, "pElement" : 1 }
{ "count" : 1, "pElement" : 5 }
{ "count" : 1, "pElement" : 10 }
{ "count" : 1, "pElement" : 9 }
{ "count" : 1, "pElement" : 7 }
{ "count" : 1, "pElement" : 4 }