MongoDB中如何删除每个iid分组内除最新文档外的其余所有文档
问题描述
现有MongoDB集合存储数据样例如下:
{_id: 0000120210903, *iid*: **00001**, date: 20210903 }, {_id: 0000220210903, *iid*: 00002, date: 20210903 }, {_id: 0000120210101, *iid*: **00001**, date: 20210101 }
需求:对集合数据按iid字段分组,每个分组仅保留日期最新的1条文档,删除分组下其余所有冗余文档。
现有实现尝试
已完成部分聚合查询,但不清楚后续处理逻辑:
db.getCollection('testing_data').aggregate( { $sort:{ _id:1 }}, { $group:{ _id:"$iid", lastId:{ "$last":"$_id" }, }}, { $project:{ _id: 0, lastId: 1 } } )
最终解决方案
实现思路:
- 先通过聚合查询获取每个
iid与对应最新文档_id的映射数组,数据量较大时添加allowDiskUse: true参数允许使用磁盘缓存,避免内存不足。 - 排序逻辑可直接按
_id排序(本场景下_id本身包含日期信息),也可根据业务需要替换为按date字段排序。 - 遍历聚合返回的结果数组,对每个
iid执行批量删除操作,删除该iid下_id不等于最新文档_id的所有数据。
完整实现代码:
var ids = db.getCollection('testing_data').aggregate([ { $sort:{ _id:1 }}, { $group:{ _id:"$iid", lastId:{ "$last":"$_id" }, }}, { $project:{ _id: 1, lastId: 1 } } ], { allowDiskUse: true } ).toArray(); ids.forEach(function(x){ db.getCollection('testing_data').deleteMany({ "iid": x._id, "_id": {$ne:x.lastId} }) });
内容的提问来源于stack exchange,提问作者Shelen
相关产品推荐
相关产品推荐

