根据辅助字段按字段删除重复项



我有一个用例,我正在处理这样的对象:

{
"data": {
"uuid": 0001-1234-5678-9101
},
"organizationId": 10192432,
"lastCheckin": 2022-03-19T08:23:02.435+00:00
}

由于我们的应用程序中存在一些旧的错误,我们在数据库中积累了许多重复项。重复的来源已经在即将发布的版本中解决了,但我需要确保在发布之前没有这样的重复,因为该版本包含对"data. uid"的唯一约束。财产。

我正在尝试删除记录,基于以下条件:

Any duplicate record based on "data.uuid" WHERE lastCheckin is NOT the most recent OR organizationId is missing.

不幸的是,我对使用MongoDB相当陌生,不知道如何在查询中表达这一点。我尝试聚合以获取重复记录,虽然我已经能够这样做,但到目前为止,我无法排除每个包含最近的"lastcheckin"的重复组中的记录。值,甚至包括"organizationid";作为集合的一部分。这是我想到的:

db.collection.aggregate([
{ $match: {
"_id": { "$ne": null },
"count": { "$gt": 1 }
}},
{ $group: {
_id: "$data.uuid",
"count": {
"$sum": 1
}
}},
{ $project: {
"uuid": "$_id", 
"_id": 0
}}
])

以上内容是根据其他各种描述重复聚合的stackoverflow帖子拼凑在一起的。我不确定这是否是处理这个问题的正确方法。我可以确定的一个直接问题是,简单地获取"data. uid"属性,如果没有任何允许我识别无效重复的附加条件,就很难想象一个查询可以删除无效记录而不获取有效记录。谢谢你的帮助。

我不确定这是否可以通过单个查询,但这就是我如何处理它,首先按lastCheckIn排序文档,然后按data.uuid分组文档,像这样:

db.collection.aggregate([
{
$sort: {
lastCheckIn: -1
}
},
{
$group: {
_id: "$data.uuid",
"docs": {
"$push": "$$ROOT"
}
}
},
]);

操场上链接。

一旦你有了这些结果,你可以过滤掉文档,根据你的标准,你想要删除和收集他们的_id。每组文档将按lastCheckIn降序排序,因此过滤应该很容易。

最后,使用以下查询删除文档:

db.collection.remove({_id: { $in: [\ array of _ids collected above] }});

相关内容

  • 没有找到相关文章

最新更新