假设我有以下文件
{ _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。我该怎么做?我应该对位置运算符使用循环吗?
最好的方法是匹配数组元素,并 $ 使用 Bulk() API 使用位置运算符分别进行更新。您真的不应该吹牛qty。
$
Bulk()
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();