如何在MongoDB中基于id和datetime字段查找重复记录?

如何在MongoDB中基于id和datetime字段查找重复记录?,mongodb,group-by,nosql,aggregation-framework,Mongodb,Group By,Nosql,Aggregation Framework,我有一个MongoDB收藏,有数百万张唱片。样本记录如下所示: [ { _id: ObjectId("609977b0e8e1c615cb551bf5"), activityId: "123456789", updateDateTime: "2021-03-24T20:12:02Z" }, { _id: ObjectId("739177b0e8e1c615cb551bf5"

我有一个MongoDB收藏,有数百万张唱片。样本记录如下所示:

[
  {
    _id: ObjectId("609977b0e8e1c615cb551bf5"),
    activityId: "123456789",
    updateDateTime: "2021-03-24T20:12:02Z"
  },
  {
    _id: ObjectId("739177b0e8e1c615cb551bf5"),
    activityId: "123456789",
    updateDateTime: "2021-03-24T20:15:02Z"
  },
  {
    _id: ObjectId("805577b0e8e1c615cb551bf5"),
    activityId: "123456789",
    updateDateTime: "2021-03-24T20:18:02Z"
  }
]
多个记录可以具有相同的
activityId
,在本例中,我只需要具有最大
updateDateTime
的记录

我曾经尝试过这样做,在较小的收藏上效果很好,但在较大的收藏上会超时

[
  {
    $lookup: {
      from: "MY_TABLE",
      let: {
        existing_date: "$updateDateTime",
        existing_sensorActivityId: "$activityId"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ["$activityId", "$$existing_sensorActivityId"] },
                { $gt: ["$updateDateTime", "$$existing_date"] }
              ]
            }
          }
        }
      ],
      as: "matched_records"
    }
  },
  { $match: { "matched_records.0": { $exists: true } } },
  { $project: { _id: 1 } }
]
这为所有具有相同活动id但小于
updateDateTime
的记录提供了
\u id
s

缓慢发生在这个步骤->
“matched_records.0”:{$exists:true}


有没有办法加快这一步,或者有没有其他方法解决这个问题?

您可以使用查找唯一文档并在新集合中写入结果,而不是查找重复文档并删除它们

如何查找唯一文档?

  • $sort
    updateDateTime
    降序排序
  • $group
    通过
    activityId
    获取第一个根记录
  • $replaceRoot
    替换根目录中的记录
  • 在新集合中写入查询结果的步骤

查找有什么用?我看不到关于第二个集合的任何详细信息。@Turivshal要在自己的集合中查找重复项,我使用聚合$lookup函数查找到自己的集合中,就像SQL将表连接到自己一样。好的,你的问题不清楚,根据你的标题和你问题中的这一点,我只想要更新时间最大的记录。你的预期结果是什么,1)你想要其他不等于最新文件的文件2)只需要最新文件?@Turivshal对混淆表示歉意。我的目标是获得所有重复ID的列表,以便删除它们。因此,我想得到1)您想要的其他文档不等于最新文档如果您在新集合中筛选唯一文档和
$out
,请参阅以选择唯一文档。
[
  { $sort: { updateDateTime: -1 } },
  {
    $group: {
      _id: "$activityId",
      record: { $first: "$$ROOT" }
    }
  },
  { $replaceRoot: { newRoot: "$record" } },
  { $out: "newCollectionName" } // set new collection name
]