mongodb 內嵌數組 批次修改問題
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-05-02 09:19:52
0
4
1011

對於一個文檔結構為:

{
  "_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中文社群

曾经蜡笔没有小新
曾经蜡笔没有小新

全部回覆(4)
習慣沉默

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 } );

仅有的幸福

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

给我你的怀抱

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

習慣沉默

同上,採用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)
 
 
 
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板