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

标签 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) { ... });

但结果是“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> }}但我应该提到的是,示例 key “111”实际上是未知的,它来自客户端发送更新数据时的情况。这就是通过此解决方案创建新对象的原因:dynamically name mongo key field

写类似 { '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 }})

关于javascript - Mongodb:将字段添加到嵌入文档中(无数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38430168/

相关文章:

javascript - 设置禁用范围输入的样式

javascript - 如何在 JavaScript 中解析嵌套 JSON 中的元素?

javascript - JSON Javascript - 属性映射 - 函数引用

c# - Mongodb最好的查询方式

mongodb - spring-data-mongodb 给出 mongodb 身份验证异常

javascript - 单击时,模糊我的内容

javascript - 使用 $httpBackend 接收二进制响应的单元测试

javascript - Highcharts 数据标签未显示在多个 x 轴和 y 轴上

javascript - 如何在谷歌地图上显示多个标记?

mongodb - mgo time.Time 或 bool 检查