簡體   English   中英

如何在mongodb中更新多個數組對象

[英]How to Update Multiple Array objects in mongodb

如何在mongodb中更新多個數組對象。 前面曾問過這個問題- 如何在mongodb中更新多個數組元素

但這對我沒有用。 我有一系列對象

{
    "_id" : ObjectId("4d2d8deff4e6c1d71fc29a07"),
    "user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0",
    "events" : [
    {
        "handled" : {
            "name": "Mike",
            "visibile": false
        },
        "profile" : 10,
        "data" : "....."
    }
    {
        "handled" : {
            "name": "Shaun",
            "visibile": false
        },
        "profile" : 10,
        "data" : "....."
    }
    {
        "handled" : {
            "name": "Glen",
            "visibile": true
        },
        "profile" : 20,
        "data" : "....."
    }
        ...
]
}

我想將所有events.handled.visible:false更新為“ events.handled.visible”:true。

我試過了

collection.aggregate({
      $match: {
        _id: ObjectId("4d2d8deff4e6c1d71fc29a07")
      }
    }, {
      $unwind: "$events"
    }, {
      "$match": {
        "events.handled.visible": false
      }
    }, {
      "$group": {
        "_id": "$_id",
        "count": {
          "$sum": 1
        }
      }
    }, {
      "$group": {
        "_id": null,
        "count": {
          "$max": "$count"
        }
      }
    }, function(err, res) {
      var max = res[0].count;
      while (max--) {
        collection.update({
          "events.handled.visible": 1
        }, {
          "$set": {
            "events.$.handled.visible": true
          }
        }, {
          "multi": true
        }, function(err, res) {
          if (err) {
            console.log("Whoops! " + err)
          } else {
            console.log("Yay! " + res)
          }
        })
      }
    } //End Function
  ) //End Aggregate

但這並沒有更新任何內容。 我想念什么?

雖然我不認為迭代期望的計數是執行此操作的“最佳”方法,但基本上是對您嘗試執行的操作的更正,並借助節點async庫對流進行控制:

  async.waterfall(
    [
      function(callback) {
        collection.aggregate(
          [
            { "$match": { "_id": ObjectId("4d2d8deff4e6c1d71fc29a07") } },
            { "$unwind": "$events" },
            { "$match": { "events.handled.visibile": false } },
            { "$group": {
              "_id": "$_id",
              "count": { "$sum": 1 }
            }}
          ],
          callback
        );
      },

      function(results,callback) {
        console.log(results);
        var result = results[0];

        async.whilst(
          function() { return result.count-- },
          function(callback) {
            collection.update(
              { "_id": result._id, "events.handled.visibile": false },
              { "$set": { "events.$.handled.visibile": true } },
              callback
            )
          },
          callback
        );
      }
    ],
    function(err) {
      if (err) throw err;
      // finished now
    }
  );

因此,這里的主要內容是您的.update()語句應改為查找"events.handled.visibile": false匹配,當然,您需要確保操作“按"events.handled.visibile": false執行,否則就沒有了真正保證您實際上是在與先前的.update()相比.update()更改狀態的文檔。

async.whilst處理流控制,以便它等待每個.update()完成,直到執行下一個。 當它的第一個邏輯語句為true (計數器已耗盡)並且所有.update()語句都運行時,循環將釋放到最終的回調。

在可能的情況下,您實際上應該按照所遵循答案中的說明使用“批量”更新操作。 它將發送所有更新,並且一次且只有一個響應,因此消除了等待每個操作完成的開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM