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

浏览:39日期:2023-07-08

问题描述

{ '_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}} );});}

请大家指正~~

问题解答

回答1:

在mongo的shell里面也可以改呀.

回答2:

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

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

回答3:

用聚合框架aggregate做呀。先用unwind解开。再update所有的status。

回答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

相关文章: