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
子文档的上一级。在mongo
shell中,我相信你需要的是:
db.collection.update({}, {$set: {'drivers_teams.drivers.111': {...}}})
这会将文档更新为:
{
"_id": 123123,
"drivers_teams": {
"drivers": {
"4": {...},
"5": {...},
"111": {...}
}
}
}
有关 MongoDB 使用的点符号的更多详细信息,请参阅 Embedded Documents page。
我正在尝试通过单个字段更新 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
子文档的上一级。在mongo
shell中,我相信你需要的是:
db.collection.update({}, {$set: {'drivers_teams.drivers.111': {...}}})
这会将文档更新为:
{
"_id": 123123,
"drivers_teams": {
"drivers": {
"4": {...},
"5": {...},
"111": {...}
}
}
}
有关 MongoDB 使用的点符号的更多详细信息,请参阅 Embedded Documents page。