【问题标题】:Mongodb: Add a field into embedded document (no array)Mongodb:在嵌入文档中添加一个字段(无数组)
【发布时间】:2016-07-18 16:05:50
【问题描述】:

我正在尝试按单个字段更新 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': &lt;data&gt; }},但我应该提到的是示例密钥“111”实际上是未知的,它在发送更新数据时来自客户端。这就是这个解决方案创建新对象的原因:dynamically name mongo key field

{ 'drivers_teams.driver.' + key: &lt;data&gt; } 之类的东西会引发错误。

【问题讨论】:

    标签: javascript json mongodb monk


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      这会将文档更新为:

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

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

      【讨论】:

        猜你喜欢
        • 2016-10-16
        • 2016-11-06
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多