MongoDB DeleteMany除最新的文档组by User



下面是一个集合中的文档示例。我想删除所有重复的文档,除了具有由用户过滤的最新版本号并按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
])

最新更新