查找重复项并保留 MongoDB 中具有最新字段值的记录
Find duplicate and keep the record with latest field value in MongoDB
我正在尝试查找重复项并删除旧文档并仅根据 mongoDB 中的字段值保留最新文档。
下面是我的 collection 的样子。我想根据guid查找副本,然后只保留有最新修订号的文档。
{
"_id": {
"$oid": "1201f1196affd5c74ca0af14"
},
"guid": "MEM-bce9",
"revision": 121,
"action": "updated"
}
{
"_id": {
"$oid": "2201f1196affd5c74ca0afc4"
},
"guid": "MEM-bce9",
"revision": 122,
"action": "deleted"
}
{
"_id": {
"$oid": "3201f1196affd5c74ca0afc4"
},
"guid": "MEM-aXt1",
"revision": 21,
"action": "created"
}
{
"_id": {
"$oid": "4201f1196affd5c74ca0afc4"
},
"guid": "MEM-aXt1",
"revision": 22,
"action": "updated"
}
{
"_id": {
"$oid": "5201f1196affd5c74ca0afc4"
},
"guid": "MEM-Mwq0",
"revision": 121,
"action": "updated"
}
预期输出
{
"_id": {
"$oid": "2201f1196affd5c74ca0afc4"
},
"guid": "MEM-bce9",
"revision": 122,
"action": "deleted"
}
{
"_id": {
"$oid": "4201f1196affd5c74ca0afc4"
},
"guid": "MEM-aXt1",
"revision": 22,
"action": "updated"
}
{
"_id": {
"$oid": "5201f1196affd5c74ca0afc4"
},
"guid": "MEM-Mwq0",
"revision": 121,
"action": "updated"
}
db.collection.aggregate([
{
"$match": {}
},
{
"$sort": {
"revision": -1
}
},
{
"$group": {
"_id": "$guid",
"latest": {
"$first": "$$ROOT"
}
}
},
{
"$replaceWith": "$latest"
}
])
我们来看最简单的情况
在您的 collection 中,修订版 x 的项目的 _id(作为时间戳)在修订版 x+1 之前。在这种情况下,自然排序顺序使此查询完全按照您的需要工作。
[{$group: {
_id: '$guid',
items: {
$push: '$$ROOT'
}
}}, {$addFields: {
lastRevision: {
$last: '$items'
}
}}]
让我们来看看这个:
您正在创建一个 object,其中共享相同指南的 collection 中的每条记录都排列为一个数组。由于最近修订的索引比以前的修订大,您只需选择数组的最后一项。
我正在尝试查找重复项并删除旧文档并仅根据 mongoDB 中的字段值保留最新文档。
下面是我的 collection 的样子。我想根据guid查找副本,然后只保留有最新修订号的文档。
{
"_id": {
"$oid": "1201f1196affd5c74ca0af14"
},
"guid": "MEM-bce9",
"revision": 121,
"action": "updated"
}
{
"_id": {
"$oid": "2201f1196affd5c74ca0afc4"
},
"guid": "MEM-bce9",
"revision": 122,
"action": "deleted"
}
{
"_id": {
"$oid": "3201f1196affd5c74ca0afc4"
},
"guid": "MEM-aXt1",
"revision": 21,
"action": "created"
}
{
"_id": {
"$oid": "4201f1196affd5c74ca0afc4"
},
"guid": "MEM-aXt1",
"revision": 22,
"action": "updated"
}
{
"_id": {
"$oid": "5201f1196affd5c74ca0afc4"
},
"guid": "MEM-Mwq0",
"revision": 121,
"action": "updated"
}
预期输出
{
"_id": {
"$oid": "2201f1196affd5c74ca0afc4"
},
"guid": "MEM-bce9",
"revision": 122,
"action": "deleted"
}
{
"_id": {
"$oid": "4201f1196affd5c74ca0afc4"
},
"guid": "MEM-aXt1",
"revision": 22,
"action": "updated"
}
{
"_id": {
"$oid": "5201f1196affd5c74ca0afc4"
},
"guid": "MEM-Mwq0",
"revision": 121,
"action": "updated"
}
db.collection.aggregate([
{
"$match": {}
},
{
"$sort": {
"revision": -1
}
},
{
"$group": {
"_id": "$guid",
"latest": {
"$first": "$$ROOT"
}
}
},
{
"$replaceWith": "$latest"
}
])
我们来看最简单的情况 在您的 collection 中,修订版 x 的项目的 _id(作为时间戳)在修订版 x+1 之前。在这种情况下,自然排序顺序使此查询完全按照您的需要工作。
[{$group: {
_id: '$guid',
items: {
$push: '$$ROOT'
}
}}, {$addFields: {
lastRevision: {
$last: '$items'
}
}}]
让我们来看看这个: 您正在创建一个 object,其中共享相同指南的 collection 中的每条记录都排列为一个数组。由于最近修订的索引比以前的修订大,您只需选择数组的最后一项。