【发布时间】: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