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

Mongodb: Add a field into embedded document (no array)

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

我的单个文档的结构 collection:

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

我想添加新的 object 例如

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

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

但结果是 "drivers_teams" 中原来的 objects 被抹掉了,只有新的字段在里面。

如果我尝试:

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

它毫不奇怪地在 drivers_teams

之外插入了一个新字段 "drivers"
{
  "_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> }} 但我应该提到的是示例密钥“111”实际上是未知的,它来自客户端发送更新数据时。这就是此解决方案创建新 object 的原因:

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

'$set'的文档中给出了在嵌入文档或数组中指定字段,可以使用点符号。对于您的情况,您可以这样做:

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 }})

您错过了 drivers 子文档的上一级。在mongoshell中,我相信你需要的是:

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

这会将文档更新为:

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

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