删除MongoDB中的重复项

Jho*_*han 8 mongodb mongodb-query

我有一个名为"contact_id"字段的集合.在我的收藏中,我有这个键的重复寄存器.

如何删除重复项,导致只有一个寄存器?

我已经尝试过:

db.PersonDuplicate.ensureIndex({"contact_id": 1}, {unique: true, dropDups: true}) 
Run Code Online (Sandbox Code Playgroud)

但是没有用,因为MongoDB 3.x中的函数dropDups不再可用

我正在使用3.2

谢谢

Sal*_*eem 24

是的,dropDups已经消失了.但是你可以用一点点努力来实现你的目标.

您需要首先找到所有重复的行,然后删除除第一行之外的所有行.

db.dups.aggregate([{$group:{_id:"$contact_id", dups:{$push:"$_id"}, count: {$sum: 1}}},
{$match:{count: {$gt: 1}}}
]).forEach(function(doc){
  doc.dups.shift();
  db.dups.remove({_id : {$in: doc.dups}});
});
Run Code Online (Sandbox Code Playgroud)

如您所见,将从数组中doc.dups.shift()删除第一个_id,然后在dups数组中删除剩余_id的所有文档.

上面的脚本将删除所有重复的文档.


ste*_*orx 6

对于mongod 3+来说这是一个很好的模式,这也确保你不会运行我们的内存,这可能发生在真正的大集合中.您可以将其保存到dedup.js文件,对其进行自定义,然后使用以下命令对所需的数据库运行:mongo localhost:27017/YOURDB dedup.js

var duplicates = [];

db.runCommand(
  {aggregate: "YOURCOLLECTION",
    pipeline: [
      { $group: { _id: { DUPEFIELD: "$DUPEFIELD"}, dups: { "$addToSet": "$_id" }, count: { "$sum": 1 } }},
      { $match: { count: { "$gt": 1 }}}
    ],
    allowDiskUse: true }
)
.result
.forEach(function(doc) {
    doc.dups.shift();
    doc.dups.forEach(function(dupId){ duplicates.push(dupId); })
})
printjson(duplicates); //optional print the list of duplicates to be removed

db.YOURCOLLECTION.remove({_id:{$in:duplicates}});
Run Code Online (Sandbox Code Playgroud)