结合两个类似的文件MongoDB

时间:2017-03-28 07:33:02

标签: mongodb mongodb-query aggregation-framework

有没有办法在mongodb中合并两个文件?

想象一下,我有一个包含这些文件的集合:

{ "_id":ObjectId("142342432"), "name":"Chris", "surname":"Patrick", "pets":["dog", "cat"] }
{ "_id":ObjectId("142342752"), "name":"Chris", "surname":"Patrick", "pets":["lizard"] }
more than x2000 documents

以及其他一些文件。我的想法是按名称和姓氏对每个条目进行分组,如果匹配,请加入pets数组$addToSet

我们的想法是删除这两个文档并添加一个新文件,其中包含新生成的ID和组合。删除一个文档并将数组附加到另​​一个文档也没关系。

我的主要问题是我应该更新集合,所以它不仅仅是一个转储。将它转储到文件中并稍后导入它可能效率低下。

谢谢!

更新:使用mongodb 3.4

1 个答案:

答案 0 :(得分:3)

您可以在一个查询中实现此目的:

  • 首先,展开pets数组
  • 然后,按namesurname分组,并将数组与 $addToSet
  • 合并
  • 最后,使用 $out
  • 将输出写入同一个集合

小心,这会覆盖原始收藏品! 在运行此之前,您应该创建当前集合的转储以避免任何数据丢失

这是查询:

db.collectionName.aggregate([  
   { $unwind: {
       path: "$pets",
       preserveNullAndEmptyArrays: true
       }
   },
   {  
      $group:{  
         _id:{  
            name:"$name",
            surname:"$surname"
         },
         pets:{  
            $addToSet:"$pets"
         }, 
         otherField: {
            $first: "$otherField"
         }
      }
   },
   {  
      $out:"collectionName"
   }
])