You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:48:04