将两个类似的文档合并到MongoDB中

将两个类似的文档合并到MongoDB中,mongodb,mongodb-query,aggregation-framework,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 和其他一些

有没有可能在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,您可以在单个查询中实现这一点:

  • 首先,展开
    pets
    array
  • 然后,按
    名称
    姓氏
    分组,并将数组与
    $addToSet
  • 最后,使用
    $out
小心,这将覆盖原始收藏 在运行此操作之前,您应该创建当前集合的转储,以避免任何数据丢失

以下是查询:

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

感谢您的回复,我不知道
$out
操作员。您知道如果要保留文档的所有其他字段(以第一次出现为准),应该怎么做吗?@lpares12是使用
$first
操作符,请参阅我的editSure,谢谢。虽然我刚刚意识到,如果文档中有
pets:[]
,his将不起作用,因为执行
$unwind
将忽略它们。@lpares12只需将
$unwind
stage的
属性设置为true以保留它们,请参阅editWhat mongod版本?@StyvaneS。我用的是Mongod3.4