我正在尝试通过单个字段更新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> }
引发错误。
在'$ 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 }})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句