我有一个用例,我正在处理这样的对象:
{
"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] }});