如何在MongoDB中复制文档并递增cd_order字段,同时打印新值?
解决MongoDB文档复制并递增字符串类型cd_order字段的问题
正确实现代码
// 获取目标原始文档,排除_id字段避免重复主键冲突 var originalDoc = db.orders.findOne({ cd_order: "7650614875" }, { _id: 0 }); // 将原始字符串类型的cd_order转为整数,作为递增基准 var baseOrderNum = parseInt(originalDoc.cd_order, 10); // 设置需要复制的次数,可按需修改(这里设为50) var copyCount = 50; // 用于存储所有新生成的cd_order值 var newOrderList = []; for (var i = 0; i < copyCount; i++) { // 创建原始文档的深拷贝,避免引用导致的对象复用问题 var newDoc = Object.assign({}, originalDoc); // 计算递增后的cd_order:基准值+循环索引+1(跳过原始值) var newOrderNum = baseOrderNum + i + 1; // 将递增后的整数转回字符串类型 newDoc.cd_order = newOrderNum.toString(); // 插入新文档到集合 db.orders.insert(newDoc); // 记录新生成的cd_order值 newOrderList.push(newDoc.cd_order); } // 按要求格式打印所有新的cd_order值 print("cd_order: " + newOrderList.join(", "));
原代码的问题分析
- 对象引用复用:直接插入
copy对象,每次循环插入的都是同一个引用的对象,没有生成新的文档实例,且未修改cd_order值。 - 聚合操作符误用:
$convert、$inc是MongoDB聚合管道专用操作符,不能直接在客户端JavaScript的for循环中以对象字面量形式使用,这类操作符需要配合aggregate()或update()等聚合方法执行。
关键实现细节
- 使用
Object.assign({}, originalDoc)创建文档副本,确保每次插入的是独立的新对象。 - 先将字符串类型的
cd_order转为整数完成递增操作,再转回字符串,保证字段类型符合要求。 - 用数组收集所有新生成的
cd_order值,最后通过join()方法拼接成指定格式打印。
内容的提问来源于stack exchange,提问作者Guilherme Matheus
相关产品推荐
相关产品推荐

