Database 从MongoDB 4.2数据库中删除重复项
我试图从MongoDB中删除重复项,但所有解决方案都失败了。 我的JSON结构:Database 从MongoDB 4.2数据库中删除重复项,database,mongodb,nosql,aggregate,Database,Mongodb,Nosql,Aggregate,我试图从MongoDB中删除重复项,但所有解决方案都失败了。 我的JSON结构: { "_id" : ObjectId("5d94ad15667591cf569e6aa4"), "a" : "aaa", "b" : "bbb", "c" : "ccc", "d" : "ddd", "key" : "057cea2fc37aabd4a59462d3fd28c93b" } 键值是md5(a+b+c+d)。 我已经有了一个超过10亿条记录的数据库,我想
{
"_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 } )
但据我所知,DropDup是在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设置,而是使用默认设置 这是我的输入集合
dups
,其中包含一些重复数据(k
,值为11
和22
):
查询将删除重复项:
如您所见,将删除以下重复数据:
在数组中获取结果:
arr
具有文档数组:
[
{
"k" : 88,
"_id" : 8
},
{
"k" : 22,
"_id" : 7
},
{
"k" : 44,
"_id" : 4
},
{
"k" : 55,
"_id" : 5
},
{
"k" : 66,
"_id" : 6
},
{
"k" : 11,
"_id" : 9
}
]
您希望使用
键
字段获取所有重复文档,并将相应的\u id
放入一个数组中;如果你的收藏有以下文档:{code>{u id:1,k:11},{u id:2,k:22},{u id:3,k:11},{u id:4,k:44},{{u id:5,k:55},{u id:6,k:66},{u id:7,k:22},{u id:8,k:88},{u id:9,k:11}/code>。生成的查询输出如下:{“resultar”:[2,3,1]}
@prasad\uu我希望“resultar”是:[{uID:1,k:11},{uID:2,k:22},{uID:4,k:44},{uID:5,k:55},{uID:6,k:66},{uID:8,k:88}]所有重复项都将被删除。我想我们可以做到这一点,删除所有重复项。我将在答案中发布查询,让我们看看是否满足您的要求。失败的原因是:“errormsg”:“assertion src/mongo/db/pipeline/value.cpp:1365”,“code”:8,“codeName”:“UnknownError”我发布的示例和代码失败了?目前尚不清楚是什么失败了。请澄清您的评论。是的,您给出的示例因错误而失败(与我发布的相同):QUERY[Js]未捕获异常:错误:命令失败:{“ok”:0,“errmsg”:“assertion src/mongo/db/pipeline/value.cpp:1365”。“code”:8,“codeName”:“UnknownError”}:聚合失败
我刚刚在mongo shell
中运行了脚本。没有错误。我使用的是MongoDB服务器版本4.0.5。我提供的代码显示了9个文档的测试数据。我想你必须计划和计算如何使用10亿个文档。
db.dups.aggregate([
{ $group: {
_id: "$k",
dups: { "$addToSet": "$_id" },
count: { "$sum": 1 }
}},
{ $project: { k: "$_id", _id: { $arrayElemAt: [ "$dups", 0 ] } } }
] )
=>
{ "k" : 88, "_id" : 8 }
{ "k" : 22, "_id" : 7 }
{ "k" : 44, "_id" : 4 }
{ "k" : 55, "_id" : 5 }
{ "k" : 66, "_id" : 6 }
{ "k" : 11, "_id" : 9 }
{ "_id" : 1, "k" : 11 }
{ "_id" : 2, "k" : 22 }
{ "_id" : 3, "k" : 11 }
var arr = db.dups.aggregate([ ...] ).toArray()
[
{
"k" : 88,
"_id" : 8
},
{
"k" : 22,
"_id" : 7
},
{
"k" : 44,
"_id" : 4
},
{
"k" : 55,
"_id" : 5
},
{
"k" : 66,
"_id" : 6
},
{
"k" : 11,
"_id" : 9
}
]