查找重复项并保留 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"
  }
])

mongoplayground

我们来看最简单的情况 在您的 collection 中,修订版 x 的项目的 _id(作为时间戳)在修订版 x+1 之前。在这种情况下,自然排序顺序使此查询完全按照您的需要工作。

[{$group: {
 _id: '$guid',
 items: {
  $push: '$$ROOT'
 }
}}, {$addFields: {
 lastRevision: {
  $last: '$items'
 }
}}]

让我们来看看这个: 您正在创建一个 object,其中共享相同指南的 collection 中的每条记录都排列为一个数组。由于最近修订的索引比以前的修订大,您只需选择数组的最后一项。