我有一个具有以下结构的mongodb文档
> db.user.find().limit(1);
{ "_id" : "1", "foo" : { "bars" : [
{
"name" : "bar1"
},
{
"name" : "bar2"
},
], ... }, ... }
我想为每个bar
添加一个新属性。我的脚本在bars
数组上进行迭代,但我无法在那里获取新属性,我该怎么做?
var users = db.user.find({"foo.bars":{$exists:true}});
users.forEach(function(user) {
user.foo.bars.forEach(function(bar)
{
printjson(bar);
//how can I specify the current 'bar' in this update?
//db.experience.update({_id: user._id}, {$set: {"what goes here?" : "newbarValue"}});
});
});
答案 0 :(得分:10)
传道人说:
var users = db.user.find({"foo.bars":{$exists:true}});
users.forEach(function(user) {
var id = user._id;
var foo_bars = user.foo.bars;
var new_foo_bars = [];
for(var i = 0; i < foo_bars.length; i++) {
var foo_bar = foo_bars[i];
foo_bar['newkey'] = 'newvalue';
new_foo_bars.push(foo_bar);
}
db.user.update({"_id":id}, {$set:{"foo.bars":new_foo_bars}});
});
答案 1 :(得分:1)
我注意到你在JS中滚动浏览客户端的数组。
如果你要成立一个新的&#34;酒吧&#34;来自旧数组的数组然后将其作为一个全新的值推入,这意味着你只需要进行一次数据库调用,而且代码非常优雅。
如果MongoDB通常不支持它,那么最好只在客户端进行工作。
答案 2 :(得分:0)
您必须单独更新嵌套文档的每个元素。使用位置运算符'$'将不起作用,因为它仅适用于第一个匹配(如文档所述)。