搜尋

首頁  >  問答  >  主體

mongodb 內嵌數組 批次修改問題

對於一個文檔結構為:

{
  "_id" : ObjectId("57133995fb5f8930d0e9b81a"),
  "taskList" : [{
      "taskId" : NumberLong(1),
      "state" : "ST00",
      "createTime" : ISODate("2016-04-17T07:21:58.424Z")
    },{
      "taskId" : NumberLong(2),
      "state" : "ST00",
      "createTime" : ISODate("2016-04-17T07:21:58.424Z")
    },{
      "taskId" : NumberLong(3),
      "state" : "ST00",
      "createTime" : ISODate("2016-04-17T07:21:58.424Z")
    }]
}

taskList 長度不確定

如何批量對數組內容進行修改呢?

例如批次修改 "_id" : ObjectId("57133995fb5f8930d0e9b81a") 的 taskList 內嵌元素 的 state 欄位 為 'ST02'

@Mongoing中文社群

曾经蜡笔没有小新曾经蜡笔没有小新2867 天前1055

全部回覆(4)我來回復

  • 習慣沉默

    習慣沉默2017-05-02 09:21:52

    MongoDB 的update語句一次只能更新陣列中符合的第一個元素。幾個思路:

    1) 重新建模,把tasklist 放到另外一個表裡,然後用reference來引用。如果你這種需求很多

    2) 先做一次查詢得到taskList的length,然後根據這個length拼update語句:

    var length = db.test.aggregate([{$project:{lenOfArray: {$size:"$taskList"}}}]).next().lenOfArray;
    var updateObj = {};
    for(var i =0;i updateObj["taskList."+ i+".stat"] = "ST02";
    }
    db.test.update({ }, {$set: updateObj } );

    回覆
    0
  • 仅有的幸福

    仅有的幸福2017-05-02 09:21:52

    怎麼把大象放進冰箱? 開門 放進去 關門
    一樣的 拿到這條數據 自己遍歷這個數組修改 存這條數據~
    一般來說是這樣的

    回覆
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-02 09:21:52

    Mongodb目前尚不支援內嵌資料的批次修改,現在只有一條一條的取update,不過可以寫一段JS方法去封裝下

    回覆
    0
  • 習慣沉默

    習慣沉默2017-05-02 09:21:52

    同上,採用js方法對每個doc進行修改後save,程式碼範例如下,題主需要自行測試下(在mongo shell中執行)

    changeState = function(doc){
        taskList = doc.taskList;
        for(var i in taskList){
            taskList[i].state = 'ST02';
        }
        db.test.save(doc)
    }
     db.test.find({"_id" : ObjectId("57133995fb5f8930d0e9b81a")}).forEach(changeState)
     
     
     

    回覆
    0
  • 取消回覆