Database 从MongoDB 4.2数据库中删除重复项

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亿条记录的数据库,我想

我试图从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 } )
但据我所知,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
        }
]