【问题标题】:MongoDB- How to remove duplicate documents?MongoDB-如何删除重复的文档?
【发布时间】:2021-11-27 03:38:01
【问题描述】:

我正在尝试创建一个脚本以使用 MongoDB 聚合框架从集合中删除重复项。

输入: 集合中的一些文档

{"_id":{"$oid":"6122ca5df5ee9d5974c6e886"},"Name":"ccc","cusId":1}
{"_id":{"$oid":"6122ca5df5ee9d5974c6e887"},"Name":"ddd","cusId":4}
{"_id":{"$oid":"6122ca5df5ee9d5974c6e888"},"Name":"eee","cusId":5}
{"_id":{"$oid":"612bc88610921de4b5a6bd0d"},"Name":"last","cusId":1}
{"_id":{"$oid":"61571141c8cdee23c9a46a3a"},"Name":"lastRecord","cusId":1}

用于查找除最后插入的文档之外的重复项的脚本

$group
{ 
     _id:  "$cusId", 
             
            mongoIds: { $addToSet: "$_id" },
            count: { $sum: 1 } 
 },$match
{
  count: { $gt: 1 }
},$project
{
   
   "duplicates":{
      "$filter":{
         "input":"$mongoIds",
         "as":"mongoId",
         "cond":{
            "$lt":[
               "$$mongoId",
               {
                  "$max":"$mongoIds"
               }
            ]
         }
      }
   }
}

预期结果

脚本的预期输出是数组副本,仅包含除了最后插入的文档之外的重复文档。

例如,对于 cusId 为 4 和 5 的文档,此 cusId 没有重复项,因此它们不应包含在重复项数组中。但是对于 cusId 为 1 的文档,应该有 2 个重复项(所有 cusId 为 1 的文档,最后插入的文档除外)

所以最终结果应该是除了最后插入的文档之外的所有重复项

{"_id":{"$oid":"6122ca5df5ee9d5974c6e886"},"Name":"ccc","cusId":1}
{"_id":{"$oid":"612bc88610921de4b5a6bd0d"},"Name":"last","cusId":1}

如何删除 cusId 相同的重复项并仅保留集合中最新插入的文档?如何获取文档创建时间?

【问题讨论】:

    标签: javascript mongodb nosql nosql-aggregation


    【解决方案1】:

    您可以在聚合管道中执行以下操作:

    1. $lookup 带有子管道的自我收集
    2. 在子管道中,做一个$group通过$toDate : "$_id"获取最新的时间戳
    3. 将根文档按$ne过滤到$lookup结果的时间戳(即不是最新的文档)
    4. $out 将结果发送到另一个集合。然后,您可以使用此输出集合通过简单的$merge 修剪您的原始集合

    这里是Mongo playground 供您参考。

    【讨论】:

    • 我正在使用的数据集没有创建字段(我更新了我的问题以反映这一点)获得创建日期的唯一方法是使用 ObjectId (_id).getTimeStamp 但我不知道如何使用聚合框架获取创建日
    • 您可以简单地使用$toDate 从objectId 中提取时间戳。更新了答案以反映这一点。
    • 感谢您的回复,但预期结果应该是重复的文档(即 cusId 4 和 5 没有重复不应显示在结果中,但 cusId 1 有重复,因此结果应该包含所有除了最后一个插入到集合中的文档之外的重复项
    • 您能否更新您的问题以提供您预期输出的具体示例?
    • 我已更新问题以包含预期结果
    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多