代码之家  ›  专栏  ›  技术社区  ›  Caldera500

在多个文档的Mongo DB数组中查找重复项

  •  0
  • Caldera500  · 技术社区  · 4 年前

    有没有一种方法可以使用mongodb聚合框架来查找文档数组中的重复项?

    下面是 收藏:

    {_id : 1, name : 'Box 1', products : [
     {pId : 123, name : 'sneaker'},
     {pId : 456, name : 'pants'},
     {pId : 789, name : 'shirt'}
    ]},
    {_id : 2, name : 'Box 2', products : [
     {pId : 123, name : 'sneaker'},
     {pId : 456, name : 'pants'},
     {pId : 111, name : 'socks'}
    ]},
    {_id : 3, name : 'Box 3', products : [
     {pId : 123, name : 'sneaker'},
     {pId : 222, name : 'belt'},
     {pId : 333, name : 'shorts'}
    ]}
    

    box.aggregate([
     {$match: {'products.pId' : {$in :  [123, 456, 789]}},
     //  ??   //
     ]);
    

    理想情况下,我希望得到这样的结果:

    [{_id : 123, count : 3,
     {_id : 456, count : 2,
     {_id : 789, count : 1}]
    

    我知道这可以通过返回所有文档并在每个产品数组中循环来实现,但我想看看mongodb是否可以直接导出。

    谢谢!!

    2 回复  |  直到 4 年前
        1
  •  1
  •   J.F.    4 年前

    您可以使用聚合以这种方式进行:

    • 弗斯特 $unwind
    • 第二 $group 通过 products.pId 并创建一个名为 count $sum
    • 最后一步是 $match 你想要的价值观。
    db.collection.aggregate([
      {
        "$unwind": "$products"
      },
      {
        "$group": {
          "_id": "$products.pId",
          "count": {"$sum": 1}
        }
      },
      {
        "$match": {"_id": {$in: [123,456,789]}}
      },
      
    ])
    

    例子 here

        2
  •  0
  •   R2D2    4 年前
     mongos> db.box.aggregate([ {$match:{"products.pId":{$in:[123,456,789]}}} ,{ $unwind:"$products"}   ,{ $group:{_id:"$products.pId" , count:{$sum:1} , containedIn:{$addToSet:"$name"}    }}    ,{$match:{count:{$gt:1}}}  ])
     { "_id" : 123, "count" : 3, "containedIn" : [ "Box 3", "Box 1", "Box 2" ] }
     { "_id" : 456, "count" : 2, "containedIn" : [ "Box 1", "Box 2" ] }
     mongos> 
    

    说明:

    1. 匹配您需要的pId
    2. 分组以查找每个pId有多少个,以及在哪个框中有重复项