mongodb 内嵌数组 批量修改问题

 手机用户2502871761 发布于 2022-10-25 11:12

对于一个文档结构为:

{
  "_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 个回答
  • 同上,采用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)
     
     
     
    2022-10-26 23:25 回答
  • Mongodb目前尚不支持内嵌数据的批量修改,现在只有一条一条的取update,不过可以写一段JS方法去封装下

    2022-10-26 23:25 回答
  • 怎么把大象放进冰箱里? 开门 放进去 关门
    一样的 拿到这条数据 自己遍历这个数组修改 存这条数据~
    一般来说是这样的

    2022-10-26 23:25 回答
  • 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 } );

    2022-10-26 23:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有