我正在尝试将对象更新为MongoDB中的数组。
这是我的文件:
> db.devis.insert({id:1,obj:[{'code':'A'},{'code':'B'}]})
> db.devis.insert({id:2,obj:[{'code':'C'},{'code':'D'}]})
> db.devis.find()
[
{
id: 1,
obj: [ { code: 'A' }, { code: 'B' } ]
},
{
id: 2,
obj: [ { code: 'C'}, { code: 'D' } ]
}
]
我选择代码为“ B”的文档。
我可以使用此命令添加一个字段:
> db.devis.update({'obj.code':'B'},{$set: {'obj.$.a':'a'}})
# Result
{
id: 1,
obj: [ { code: 'A'}, { code: 'B', a: 'a'} ]
}
现在我要添加几个字段:
> var = {'foo':'foo', 'bar':'bar'}
> db.devis.update({'obj.code':'B'},{$set: {'obj.$': var}})
# Result
{
id: 1,
obj: [ { code: 'A'}, { foo: 'foo', bar: 'bar'} ]
}
# What I want
{
id: 1,
obj: [ { code: 'A'}, { code: 'B', foo: 'foo', bar: 'bar'} ]
}
对象被覆盖。
可以在其中插入变量中的几个字段?
答案 0 :(得分:2)
这里的问题是您要设置整个对象。
当您做{$set: {obj.$:{yourObject}}}
时,您会告诉mongo:“将整个对象obj
设置为我已通过的对象”。
看看这个example
带有code : B
的对象是全新的,因为您的$
运算符指向该对象,而$set
会将新对象放置在该位置。
您需要这个:
db.collection.update({
"obj.code": "B"
},
{
"$set": {
"obj.$.foo": "bar",
"obj.$.foo2": "bar2"
}
})
在这种情况下,您的$set
使用$
运算符将字段更新为对象,而不是对象本身。
通过这种方式,您告诉mongo:“在对象中找到了一个名为'foo'的变量,其值为'bar'和另一个变量'foo2'的变量为'bar2'””
我希望我已经很好地解释了两个查询之间的区别。
因此,未经测试,但使用:
var = {'obj.$.foo':'foo', 'obj.$.bar':'bar'}
db.devis.update({'obj.code':'B'},{$set: var})
应该可以。
示例here