【问题标题】:How to change all the array elements in a mongodb document to a certain value? [duplicate]如何将mongodb文档中的所有数组元素更改为某个值? [复制]
【发布时间】:2015-12-13 03:53:09
【问题描述】:

假设我有以下文档

{
   _id: ObjectId("5234cc89687ea597eabee675"),
   code: "xyz",
   tags: [ "school", "book", "bag", "headphone", "appliance" ],
   qty: [
          { size: "S", num: 10, color: "blue" },
          { size: "M", num: 45, color: "blue" },
          { size: "L", num: 100, color: "green" }
        ]
}

{
   _id: ObjectId("5234cc8a687ea597eabee676"),
   code: "abc",
   tags: [ "appliance", "school", "book" ],
   qty: [
          { size: "6", num: 100, color: "green" },
          { size: "6", num: 50, color: "blue" },
          { size: "8", num: 100, color: "brown" }
        ]
}

{
   _id: ObjectId("5234ccb7687ea597eabee677"),
   code: "efg",
   tags: [ "school", "book" ],
   qty: [
          { size: "S", num: 10, color: "blue" },
          { size: "M", num: 100, color: "blue" },
          { size: "L", num: 100, color: "green" }
        ]
}

我想将文档中具有代码“efg”的所有元素的数量更改为 0。我该怎么做?我应该使用位置运算符的循环吗?

【问题讨论】:

    标签: javascript node.js mongodb mongodb-query


    【解决方案1】:

    最好的方法是匹配数组元素,并使用Bulk() API 使用位置$ 运算符单独更新。你真的不应该炸毁你的qty 数组。

    var bulk = db.mycollection.initializeOrderedBulkOp(),   
        count = 0;
    
    db.mycollection.find({ "code" : "efg" }).forEach(function(doc){ 
        var qty = doc["qty"]; 
        for (var idx = 0; idx < qty.length; idx++){ 
            bulk.find({ 
                "_id": doc._id, 
                "qty": { "$elemMatch": { "num": qty[idx]["num"]}}
            }).update({ "$set": { "qty.$.num": 0 }})
        }     
        count++;  
        if (count % 200 == 0) { 
            // Execute per 200 operations and re-init.
            bulk.execute(); 
            bulk = db.mycollection.initializeOrderedBulkOp(); 
        } 
    })
    
    // Clean up queues
    if (count % 200 != 0)
        bulk.execute(); 
    

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      相关资源
      最近更新 更多