更新mongodb中数组中的多个元素

时间:2018-07-06 09:09:52

标签: arrays mongodb mongodb-query

我在mongodb的股票集中有一个类似以下的文件。

{ _id: 'xRMuRBhqRLgASyQyW',
  History: 
     [ { orderId: '12032017001877',
         status: 'COMPLETED',
        },
       { orderId: '22122017002450', 
        status: 'PROCESSED',
        },
        { orderId: '22122018002450', 
        status: 'DEPOSIT',
        }  
     ] 
 }

我想遍历stocks集合中的所有文档,如果状态不是flag: true,则添加一个字段'PROCESSED'

4 个答案:

答案 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非常相似,但 添加了两个额外的参数(用于upsertmulti)。供参考,您可以检查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.
)