繁体   English   中英

Mongodb:将字段添加到嵌入式文档中(无数组)

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

我正在尝试通过单个字段更新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) { ... });

但是结果是,“ drivers_teams”中的原始对象被清除,并且其中只有新字段。

如果我尝试:

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'实际上是未知的,它来自客户端,当它发送更新数据时。 这就是该解决方案创建新对象的原因: 动态命名mongo key field

编写类似{ 'drivers_teams.driver.' + key: <data> } { '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子文档上方的级别。 mongo shell中,我相信您需要的是:

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

这会将文档更新为:

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

有关MongoDB使用的点符号的更多详细信息,请参见“ 嵌入式文档”页面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM