Mongodb:在嵌入文档中添加一个字段(无数组)

时间:2016-07-18 06:46:57

标签: javascript json mongodb monk

我试图通过单个字段更新mongodb json文档。我知道如果我的数据是在对象数组中会很容易,但由于原因和早期设计选择不知情,它只是对象中的对象。

我的收藏中单个文档的结构:

{
  "_id": 123123,
  "drivers_teams": { 
    "drivers" : { 
       "4" : { <data> },
       "5" : { <data indeed> },
       ...
    },
    ...
  }
 } 

我想添加新对象,例如

const collection = db.get('collection');
let drivers = { };  
drivers['111'] = { <new data> };

collection.update({}, {$set: { drivers_teams: { drivers } }}, { upsert: true }, function (err, doc) { ... });

但结果是&#34; drivers_teams&#34;中的原始对象。被消灭,只有新的领域。

如果我尝试:

collection.update({}, {$set: {  drivers }}, { upsert: true }, function (err, doc) { ... });

毫不奇怪地插入一个新领域&#34; drivers&#34;在drivers_teams之外

{
  "_id": 123123,
  "drivers" : { <new data> },
  "drivers_teams": { <still original> }
 }

类似的问题(+解决方案)在这里,但json不像我的那样嵌套。 https://groups.google.com/forum/#!topic/mongodb-user/ZxdsuIU94AY

有没有办法实现我想要做的事情?或者,当我想更新单个字段时,我应该放弃并覆盖整个文档吗?

修改

这里的工作解决方案是{$set: { 'drivers_teams.drivers.111': <data> }},但我应该提到的是示例密钥&#39; 111&#39;实际上是未知的,它来自客户端发送更新数据时。这就是为什么新对象是由此解决方案创建的:dynamically name mongo key field

{ 'drivers_teams.driver.' + key: <data> }之类的内容会引发错误。

2 个答案:

答案 0 :(得分:1)

在&#39; $ set&#39;的文档中给出了它。要在嵌入文档或数组中指定字段,可以使用点表示法。对于您的情况,您可以这样做:

collection.update({}, 
   {
      $set: { "drivers_teams.drivers.111": { <new data> }}
   }, 
   { upsert: true }, function (err, doc) { ... });

https://docs.mongodb.com/manual/reference/operator/update/set/

修改 如果要动态生成字段名称,则可以执行以下操作:

const collection = db.get('collection');
let set_obj= { };  
set_obj['drivers_teams.driver.' + key] =  { <new data> };

collection.update({}, {$set: set_obj }})

答案 1 :(得分:0)

您错过了drivers子文档以上的级别。在mongo shell中,我相信您需要的是:

db.collection.update({}, {$set: {'drivers_teams.drivers.111': {...}}})

将更新文档:

{
  "_id": 123123,
  "drivers_teams": {
    "drivers": {
      "4": {...},
      "5": {...},
      "111": {...}
    }
  }
}

有关MongoDB使用的点符号的更多详细信息,请参阅Embedded Documents page