{
"_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
}
}
);
});
}
請大家指正~~
天蓬老师2017-04-25 09:04:17
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
我也遇到了類似的問題,查了一下官方文檔,我本地的解決方案如上,希望幫到你
phpcn_u15822017-04-25 09:04:17
這個可以做到的, 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