将多个字段添加到包含对象的数组中

时间:2020-11-10 11:51:02

标签: arrays mongodb mongodb-query

我正在尝试将对象更新为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'} ]
}

对象被覆盖。
可以在其中插入变量中的几个字段?

1 个答案:

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