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

對於一個文檔結構為:

{
  "_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<length;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)
 
 
 
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!