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的所有文档.
上面的脚本将删除所有重复的文档.
对于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)
归档时间: |
|
查看次数: |
10480 次 |
最近记录: |