MongoDB:在每个数组元素中添加字段

时间:2017-07-24 15:49:23

标签: mongodb meteor nosql

我从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
  }
 ]
}

有没有人能解决这种情况?

3 个答案:

答案 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);
  });