{
"_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
}
}
);
});
}
请大家指正~~
mongo シェルでも変更できます
リーリー
私も同様の問題に遭遇しました。公式ドキュメントを確認したところ、私のローカルの解決策が上記のとおりであることがわかりました。お役に立てれば幸いです
これを行うには、集計フレームワークの集計を使用します。まずはunwindで巻き戻します。次に、すべてのステータスを更新します。
これは可能です。mongodb は、埋め込みデータ オブジェクトを更新するためのドル記号「$」を提供します。
リーリー結果が必要な場合は、次のステートメントを書くことができます:
ただし、更新条件ステートメントにはデータ内のオブジェクトの条件が含まれている必要があることに注意してください。たとえば、上記の {"messaage.status":true} を他のものに変更することもできます。
mongodb のドキュメントを参照してください: http://docs.mongodb.org/manual/reference/operator/update/positional/#update-documents-in-an-array