MongoDB中为数组内每个对象新增字段的方法
解决方案:为MongoDB数组内所有对象新增字段
MongoDB 3.2+ 版本(推荐)
使用MongoDB的数组通配符操作符$[],可以一次性更新数组中的所有元素,无需关心数组长度。执行以下命令:
// 替换your_collection为你的集合名称 db.your_collection.updateMany( {}, // 匹配集合中所有文档 { $set: { "Products.$[].Temp": "Hello" } } // 为Products数组的每个元素新增Temp字段 )
补充说明:
updateMany()会批量作用于所有符合条件的文档,这里{}表示匹配全部文档"Products.$[].Temp"中的$[]代表数组内的每一个元素,$set会为每个元素添加Temp字段并赋值为"Hello"- 如果数组中已有元素存在
Temp字段,上述操作会覆盖原有值。若要避免覆盖,可使用MongoDB 3.6+支持的数组过滤器:
db.your_collection.updateMany( {}, { $set: { "Products.$[elem].Temp": "Hello" } }, { arrayFilters: [ { "elem.Temp": { $exists: false } } ] } )
低版本MongoDB(3.0及以下)
如果你的MongoDB版本低于3.2,无法使用$[]语法,可通过遍历文档和数组的方式实现:
db.your_collection.find().forEach(function(doc) { // 遍历当前文档的Products数组 doc.Products.forEach(function(product) { product.Temp = "Hello"; }); // 保存更新后的文档 db.your_collection.save(doc); });
效果示例
假设原文档结构如下:
{ "_id": ObjectId("123"), "Products": [ { "name": "Product A", "price": 100 }, { "name": "Product B", "price": 200 } ] }
执行更新命令后,文档会变为:
{ "_id": ObjectId("123"), "Products": [ { "name": "Product A", "price": 100, "Temp": "Hello" }, { "name": "Product B", "price": 200, "Temp": "Hello" } ] }
内容的提问来源于stack exchange,提问作者Akash Raj
相关产品推荐
相关产品推荐

