mongodb如何批量修改内嵌文档的属性?

 mobiledu2502863683 发布于 2022-10-25 17:12
{
  "_id" : ObjectId("52fb2ceb1e2f8622d4228a7a"),
  "from" : 0,
  "message" : [{
      "data" : "test1",
      "status" : true,
      "time" : 1
    }, {
      "data" : "test2",
      "status" : true,
      "time" : 2
    }],
  "to" : 1,
  "type" : "s"
}

如何用一条命令把message数组中2个对象元素中的status属性都改成false?

是否只能在客户端做逻辑处理:

var cursor =  db.msg.find({“to”: uid, “message.status”: false});
while(cursor.hasNext()){  //由于默认情况下find取得的游标已经做过快照,所以理论上不会影响在find之后新增的数据
    var doc = cursor.next();
    var from = doc.from;
    var type = doc.type;
        //循环对应文档的message数组中的所有元素,进行逐行更改
    item.message.foreach(function(msg){
         db.msg.update({
                “to”: uid,
                “from”: from,
                “type”: type,
                “message.time”: msg.time
            },
            {
                “$set”: {
                        “message.$.status”: true    
                    }
                }
            );
        });
}

请大家指正~~

4 个回答
  • 这个可以做到的, mongodb提供了一个更新内嵌数据对象的美元符号"$".
    如你想要的结果, 可写如下语句:

        db.test.update({_id:ObjectId("52fb2ceb1e2f8622d4228a7a"), "message.status":true}, 
            {$set:{"message.$.status":false}})
    

    但这种需注意, 你的更新条件语句中需包含数据内对象的条件. 如上面的 {"messaage.status":true}, 你也可以换成其他.

    可参考mongodb 文档: http://docs.mongodb.org/manual/reference/operator/update/positional/#update-documents-in-an-array

    2022-10-26 23:27 回答
  • 用聚合框架aggregate做呀。先用unwind解开。再update所有的status。

    2022-10-26 23:27 回答
  • var true_metadata = db.modulestore.find({"metadata.tabs": {$exists: true}})
    var updated_tabs = [];
    
    true_metadata.forEach(function(item){
        var tabs = item.metadata.tabs
        if (item && item.metadata && tabs ){
            tabs.forEach(function(item){
                if(item.type == "wiki") {
                    item.name = "资料";
                }
            })
    
        db.modulestore.update({"_id": item._id}, {$set: {
                "metadata.tabs": tabs 
        }})
    
        updated_tabs.push(tabs)
     }
    })
    
    updated_tabs
    

    我也遇到了类似的问题,查了一下官方文档,我本地的解决方案如上,希望帮到你

    2022-10-26 23:27 回答
  • 在mongo的shell里面也可以改呀.

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