我从mongoDB开始,我想在我的文档中更新一个嵌套数组以添加一些初始值,但我找不到用mong做的方法。
这是我的文件:
{
"_id":"cTZDL7WThChSvsvBT",
"name":"abc",
"players":[
{
"playerName":"Name1"
},
{
"playerName":"Name2"
}
]
}
我想做什么:
{
"_id":"cTZDL7WThChSvsvBT",
"name":"abc",
"players":[
{
"playerName":"Name1",
"NewField1":0,
"NewField2":0
},
{
"playerName":"Name2",
"NewField1":0,
"NewField2":0
}
]
}
有没有人能解决这种情况?
答案 0 :(得分:0)
考虑到你想要更新一个对象元素,
怎么样?
db.collections.updateOne({_id: "cTZDL7WThChSvsvBT"}, {$set: {"players.0.NewField1": 0, "players.0.NewField2: 0}});
答案 1 :(得分:0)
这会将新字段添加到player
数组...
db.collection.update({_id: 'cTZDL7WThChSvsvBT', players: {$exists: true}}, {$set: {'players.$.NewFieldOne': 0, 'players.$.NewFieldTwo': 0}})
...但是因为Mongo will only update the first element of an array which matches the query你有点蠢。当然,您可以通过使用位置运算符(如我的示例中)或通过选择特定元素(如上一张海报建议的那样)来选择要更新的数组元素,但直到Mongo支持数组更新'关于所有元素,我认为你留下了解决方案,例如:找到相关文档,然后更新每个文档(即客户端更新解决方案)。
答案 2 :(得分:0)
我终于通过直接编辑JS中的文档找到了一种方法:
db.doc.find({_id: myDocId}).forEach(function (channel) {
channel.players.forEach(function (player) {
player.newField1 = 0;
player.newField2 = 0;
});
db.doc.update({_id: myDocId}, channel);
});