【发布时间】:2019-10-16 08:44:19
【问题描述】:
我正在尝试从 MongoDB 中删除重复项,但所有解决方案都失败了。 我的 JSON 结构:
{
"_id" : ObjectId("5d94ad15667591cf569e6aa4"),
"a" : "aaa",
"b" : "bbb",
"c" : "ccc",
"d" : "ddd",
"key" : "057cea2fc37aabd4a59462d3fd28c93b"
}
键值为md5(a+b+c+d)。 我已经有一个包含超过 10 亿条记录的数据库,我想根据键删除所有重复项,并在使用唯一索引后,因此如果键已经在数据库中,则不会再次插入记录。
我已经试过了
db.data.ensureIndex( { key:1 }, { unique:true, dropDups:true } )
但据我了解,dropDups 已在 MongoDB > 3.0 中删除。
我还尝试了几个 java 脚本代码,例如:
var duplicates = [];
db.data.aggregate([
{ $match: {
key: { "$ne": '' } // discard selection criteria
}},
{ $group: {
_id: { key: "$key"}, // can be grouped on multiple properties
dups: { "$addToSet": "$_id" },
count: { "$sum": 1 }
}},
{ $match: {
count: { "$gt": 1 } // Duplicates considered as count greater than one
}}
],
{allowDiskUse: true} // For faster processing if set is larger
).forEach(function(doc) {
doc.dups.shift(); // First element skipped for deleting
doc.dups.forEach( function(dupId){
duplicates.push(dupId); // Getting all duplicate ids
}
)
})
它失败了:
QUERY [Js] uncaught exception: Error: command failed: {
“ok“: 0,
“errmsg“ : “assertion src/mongo/db/pipeline/value.cpp:1365“.
“code“ : 8,
“codeName" : “UnknownError“
} : aggregate failed
我没有更改 MongoDB 设置,使用默认设置。
【问题讨论】:
-
你正在寻找所有带有
key字段的重复文档,并将对应的_ids放入一个数组中;这就是那个查询的全部内容吗? -
如果您的收藏有以下文件:
{ "_id" : 1, "k" : 11 }, { "_id" : 2, "k" : 22 }, { "_id" : 3, "k" : 11 }, { "_id" : 4, "k" : 44 }, { "_id" : 5, "k" : 55 }, { "_id" : 6, "k" : 66 }, { "_id" : 7, "k" : 22 }, { "_id" : 8, "k" : 88 }, { "_id" : 9, "k" : 11 }。结果查询输出如下:{ "resultArr" : [ 2, 3, 1 ] }. -
@prasad_ 我希望 "resultArr" 为: [ { "_id" : 1, "k" : 11 }, { "_id" : 2, "k" : 22 }, { "_id “:4,“k”:44 },{“_id”:5,“k”:55 },{“_id”:6,“k”:66 },{“_id”:8,“k”: 88 }] 将删除所有重复项。
-
我认为我们可以得到它,删除所有重复项。我将在答案中发布查询,看看是否符合您的要求。
标签: database mongodb nosql aggregate