MongoDB- 如何删除重复文件?

MongoDB- How to remove duplicate documents?

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

输入: collection

中的一些文档
{"_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 相同的重复项,只保留 collection 中最新插入的文档?如何获取文档创建时间?

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

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

这里是Mongo playground供大家参考。