【问题标题】:Remove duplicates from MongoDB 4.2 data base从 MongoDB 4.2 数据库中删除重复项
【发布时间】: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


【解决方案1】:

这是我的输入集合 dups,有一些重复数据(k 的值 1122):

{ "_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 }

查询删除重复项

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()

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
        }
]

【讨论】:

  • 失败:“errormsg”:“assertion src/mongo/db/pipeline/value.cpp:1365”,“code”:8,“codeName”:“UnknownError”
  • 我贴的例子和代码失败了?目前还不清楚是什么失败了。请澄清您的评论。
  • 是的,您给出的示例因错误而失败(与我发布的相同):QUERY [Js] uncaught exception: Error: command failed: { “ok“: 0, “errmsg“ : “assertion src/mongo/db/pipeline/value.cpp:1365“. “code“ : 8, “codeName" : “UnknownError“ } : aggregate failed
  • 我刚刚在mongo shell 中运行了脚本。 没有错误。我正在使用 MongoDB 服务器版本 4.0.5。
  • 我提供的代码显示了 9 个文档的测试数据。我想您必须计划并弄清楚如何处理十亿份文档。
猜你喜欢
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
相关资源
最近更新 更多