在文档中查找每个数组中数组元素的条目数

时间:2016-06-23 11:10:25

标签: mongodb

我收集了这些文件:

[
    {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}
]

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

您应该使用具有以下阶段的Aggregation Pipeline

  1. 分解p数组并为每个元素生成一个文档。您可以使用$unwind运算符来执行此操作。
  2. 根据p值对生成的文档进行分组,并使用$group运算符和$sum累加器运算符计算每个文档的出现次数。
  3. 使用$project运算符将前一阶段结果重塑为{pElement: p, count: c}
  4. 使用$sort运算符根据count值对其进行排序。
  5. 最终聚合代码如下所示:

    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 }