我在mongodb的股票集中有一个类似以下的文件。
{ _id: 'xRMuRBhqRLgASyQyW',
History:
[ { orderId: '12032017001877',
status: 'COMPLETED',
},
{ orderId: '22122017002450',
status: 'PROCESSED',
},
{ orderId: '22122018002450',
status: 'DEPOSIT',
}
]
}
我想遍历stocks
集合中的所有文档,如果状态不是flag: true
,则添加一个字段'PROCESSED'
。
答案 0 :(得分:7)
您需要使用所有$[] positional运算符来更新数组中的每个元素
db.collection.update(
{ "History": { "$elemMatch": { "status": { "$ne": "PROCESSED" } } } },
{ "$set": { "History.$[].flag": false } },
{ "multi": true }
)
答案 1 :(得分:1)
您只需使用'$'运算符即可。像这样:
db.stocks.update( {"history.status" : { $not: "PROCESSED" } ,
{ $set: {"history.$.flag": true }} ,
false ,
true);
答案 2 :(得分:1)
您可以使用脚本来实现。
db.stocks.find().forEach(function(e){var modified=false;e.History.forEach(function(o){if(o.status!="PROCESSED"){o.flag=true;modified=true}});if(modified){db.stocks.save(e)}});
答案 3 :(得分:0)
我的答案与@Anthony非常相似,但
添加了两个额外的参数(用于upsert
和multi
)。供参考,您可以检查official document。
db.stocks.update(
{ "History": { "$elemMatch": { "status": { "$ne": "PROCESSED" } } } },
{ "$set": { "History.$[].flag": false }},
false, // show that if there is not any document with specified criteria , it will not create a new document.
ture // according to document of mongodb if multi is true then more than one document will be updated, other wise only one document will be updated.
)