{ "_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 } } ); }); }
请大家指正~~
这个可以做到的, 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
用聚合框架aggregate做呀。先用unwind解开。再update所有的status。
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
我也遇到了类似的问题,查了一下官方文档,我本地的解决方案如上,希望帮到你
在mongo的shell里面也可以改呀.