如何为MongoDB集合文档按每100个递增添加指定值的新字段?
给MongoDB集合批量添加分段字段的实现方案
针对你的需求,这里提供两种实用的实现方式,按需选择即可:
方法一:Mongo Shell循环批量更新(全版本兼容)
通过脚本按批次循环处理,适合所有MongoDB版本。核心是先按指定字段排序确保顺序稳定,再每100条为一组更新字段值。
// 替换为你的集合名称 const coll = db.getCollection('your_collection'); const batchSize = 100; const totalDocs = coll.countDocuments(); const totalGroups = Math.ceil(totalDocs / batchSize); // 按_id排序(可替换为业务排序字段,比如创建时间create_time) for (let group = 1; group <= totalGroups; group++) { const skipCount = (group - 1) * batchSize; // 提取当前组的所有文档_id const docIds = coll.find({}, { _id: 1 }) .sort({ _id: 1 }) .skip(skipCount) .limit(batchSize) .map(doc => doc._id); // 更新当前组的字段值 coll.updateMany( { _id: { $in: docIds } }, { $set: { group_tag: `${group}` } } ); print(`完成第${group}组更新,处理${docIds.length}条文档`); }
方法二:聚合管道+批量写入(MongoDB 5.0+)
利用MongoDB 5.0新增的窗口函数,一步计算出每个文档的分组号,再批量更新,效率更高。
// 替换为你的集合名称 const coll = db.getCollection('your_collection'); const batchSize = 100; // 通过聚合计算每个文档的分组号 const updateData = coll.aggregate([ // 按指定字段排序(确保分组顺序稳定) { $sort: { _id: 1 } }, { $setWindowFields: { partitionBy: null, // 整个集合作为一个窗口 sortBy: { _id: 1 }, output: { docSeq: { $documentNumber: {} } // 生成从1开始的连续序号 } } }, { $project: { _id: 1, group_tag: { $toString: { $ceil: { $divide: ["$docSeq", batchSize] } } // 计算分组号并转字符串 } } } ]).toArray(); // 批量写入更新 const bulkOps = updateData.map(item => ({ updateOne: { filter: { _id: item._id }, update: { $set: { group_tag: item.group_tag } } } })); if (bulkOps.length > 0) { coll.bulkWrite(bulkOps); print(`完成全部更新,共处理${bulkOps.length}条文档`); }
注意事项
- 操作前务必备份集合:
db.your_collection.copyTo('your_collection_backup'),避免数据意外丢失 - 排序字段要选稳定的唯一字段(如
_id、创建时间),否则分组会出现混乱 group_tag可替换为你实际需要的字段名
内容的提问来源于stack exchange,提问作者Tribe56123
相关产品推荐
相关产品推荐

