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 中最新插入的文档?如何获取文档创建时间?
您可以在聚合管道中执行以下操作:
$lookup
带有子流水线的自集
- 在子流水线中,做一个
$group
通过$toDate : "$_id"
得到最新的时间戳
- 通过
$ne
过滤根文档到 $lookup
结果的时间戳(即不是最新文档)
$out
结果到另一个集合。然后,您可以使用此输出集合通过简单的 $merge 修剪原始集合
这里是Mongo playground供大家参考。
我正在尝试创建一个脚本,使用 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 中最新插入的文档?如何获取文档创建时间?
您可以在聚合管道中执行以下操作:
$lookup
带有子流水线的自集- 在子流水线中,做一个
$group
通过$toDate : "$_id"
得到最新的时间戳
- 通过
$ne
过滤根文档到$lookup
结果的时间戳(即不是最新文档) $out
结果到另一个集合。然后,您可以使用此输出集合通过简单的 $merge 修剪原始集合
这里是Mongo playground供大家参考。