MongoDB批量复制文档属性:将translations.de值拷贝至de_formal
MongoDB批量复制文档内属性值到新属性的正确方法
你的需求是把translations_test集合中每个文档的translations.de值复制到同层级的新属性translations.de_formal,原语句无法生效的原因是:你在$set里直接用db.translations_test.find(...)赋值,这个查询会返回游标对象,而不是当前文档的translations.de字段值,逻辑完全错误。
正确实现方法(推荐,MongoDB 4.2+)
使用updateMany结合聚合管道,直接引用当前文档的字段值完成批量更新,效率最高:
db.translations_test.updateMany( {}, // 匹配所有文档 [ { $set: { "translations.de_formal": "$translations.de" } } ] );
这里通过聚合管道的$set操作符,用$前缀引用当前文档的translations.de字段值,直接赋值给新属性,一次操作就能完成所有文档的更新。
兼容旧版本MongoDB(4.2以下)的方法
如果你的MongoDB版本不支持聚合管道更新,可以用遍历文档的方式逐个更新:
db.translations_test.find().forEach(doc => { // 先判断字段是否存在,避免空值报错 if (doc.translations?.de) { db.translations_test.updateOne( { _id: doc._id }, { $set: { "translations.de_formal": doc.translations.de } } ); } });
这种方法会遍历集合里的每个文档,逐个执行更新操作,适合旧版本,但效率不如聚合管道,数千条数据也能正常运行。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

