下面是一个集合中的文档示例。我想删除所有重复的文档,除了具有由用户过滤的最新版本号并按guid
分组的文档。[
{
_id: ObjectId("5e8e2d28ca6e660006f263e6"),
guid: 1,
revision: 1,
user:1
},
{
_id: ObjectId("5e8e2d28ca6e660006f263e7"),
guid: 1,
revision: 2,
user:1
},
{
_id: ObjectId("5e8e2d28ca6e660006f264d0"),
guid: 2,
revision: 5,
user:1
},
{
_id: ObjectId("5e8e2d28ca6e660006f264d1"),
guid: 1,
revision: 5,
user:1
},
{
_id: ObjectId("5e8e2d28ca6e660006f264d2"),
guid: 3,
revision: 5,
user:2
}
]
期望输出应该删除以下文档对于用户:1
-- _id: ObjectId("5e8e2d28ca6e660006f263e6"),
-- _id: ObjectId("5e8e2d28ca6e660006f263e7"),
-- _id: ObjectId("5e8e2d28ca6e660006f264d0"),
对于用户:2没有一个
我已经尝试下面查询它的工作原理,但在场景失败时,我有相同的指导和相同的修订号。如果两者相同,则任何人都可以删除
db.collection.find({guid:1,revision:1}).sort({revision:-1}).forEach(function(doc){
console.log(db.collection.deleteMany({revision:{$lt:doc.revision}, guid:doc.guid}));
})
请帮助。提前感谢
试试这个
步骤1
获取最后修改的文档
let data = await db.collection.aggregate([
{
$sort: {
user: 1,
guid: 1,
revision: -1
}
},
{
$group: {
_id: {
guid: "$guid",
user: "$user"
},
id: {
$first: "$_id"
},
guid: {
$first: "$guid"
},
user: {
$first: "$user"
},
revision: {
$first: {
$max: "$revision"
}
},
doc: {
$last: "$$ROOT"
}
},
},
{
$project: {
_id: "$id",
guid: 1,
revision: 1,
user: 1
}
},
])
mongoplayground
步骤2
获取结果数据的_id
x = data.map(item=>item._id);
步骤3
删除x
以外的文档
db1.deleteMany({ "_id": { $nin: x } });
单个查询执行相同任务的选项2
let data = await db.collection.aggregate([
{
$sort: {
user: 1,
guid: 1,
revision: -1
}
},
{
$group: {
_id: {
guid: "$guid",
user: "$user"
},
id: {
$first: "$_id"
},
guid: {
$first: "$guid"
},
user: {
$first: "$user"
},
revision: {
$first: {
$max: "$revision"
}
},
doc: {
$last: "$$ROOT"
}
},
},
{
$project: {
_id: "$id",
guid: 1,
revision: 1,
user: 1
}
},
{ $out: "temp1" } // temp1 is the collection name
])