WechatIMG269.jpeg

文档结构简版:

{
	"_id": ObjectId("5d0cc849f7b9c23b1c49dd5f"),
	"inv_id": 818400,
	"inv_no": 779385470,
	"book": {
		"house_id": 60088460,
		"code": "5015001843300",
		"rooms": [{
			"id": 60551930,
			"code": "03",
			"face": "南",
			"has_ailock": 0
		}]
	}
}

期望对rooms中增加一个新的属性 name, MongoDB 版本是 3.2.4 , 测试修改单个文档,执行脚本为:


db.test.find({"inv_id":818400}).forEach( 
    function(item) {
        var rooms = item.book.rooms;
        for (var idx in rooms) {
            rooms[idx].name = 'hello_test';
        }
       db.test.update({"_id":item._id}, {$set: {"book.rooms": rooms}});
    }
);

如果只是想增加一个字段,并且 MongoDB 版本是 3.6 以上可以用如下脚本:


db.test.find({"inv_id":818400}).forEach( 
    function(item) {
       db.test.update({"_id":item._id}, {$set: {"book.rooms.$.name": "hello_test2"}});
    }
);


有了第一个脚本,就可以对这类对象数组属性值为所欲为地修改了,比如批量刷数据:


db.test.find({"valid_state":1}).forEach( 
    function(item) {
        var rooms = item.book.rooms;
        for (var idx in rooms) {
            if(rooms[idx].code === "02")
            rooms[idx].name = "次卧_test";
        }
       db.test.update({"_id":item._id}, {$set: {"book.rooms": rooms}});
    }
);