【问题标题】:Combine two similar documents MongoDB合并两个相似的文档 MongoDB
【发布时间】:2017-03-28 21:00:48
【问题描述】:

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

【问题讨论】:

  • 你用的是什么mongod版本?
  • @StyvaneS。我正在使用 mongod 3.4

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

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

  • 首先,展开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"
   }
])

【讨论】:

  • 感谢回复,不知道$out运营商。如果我想保留文档的所有其他字段,你知道我应该怎么做吗?
  • @lpares12 是的,请使用 $first 运算符,查看我的编辑
  • 好的,谢谢。虽然我刚刚意识到他在有pets : [] 的文件的情况下不起作用,因为做$unwind 会忽略它们。
  • @lpares12 juste 将 $unwind 阶段的 preserveNullAndEmptyArrays 属性设置为 true 以保留它们,请参阅编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2016-03-20
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多