【问题标题】:MongoDB : Add field in each array elements [duplicate]MongoDB:在每个数组元素中添加字段[重复]
【发布时间】:2017-07-25 05:58:04
【问题描述】:

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

有没有人解决这种情况?

【问题讨论】:

    标签: mongodb meteor nosql


    【解决方案1】:

    这会将新字段添加到 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】:

    我终于找到了一种方法,像这样在 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);
      });
    

    【讨论】:

      【解决方案3】:

      考虑到你想更新一个也是对象的元素,

      这个怎么样?

      db.collections.updateOne({_id: "cTZDL7WThChSvsvBT"}, {$set: {"players.0.NewField1": 0, "players.0.NewField2: 0}});
      

      【讨论】:

      • 效果很好,但仅适用于第一个“玩家”。我不知道数组的大小,我需要将值添加到每个数组中。
      • 我认为这与这个案例类似,stackoverflow.com/questions/4669178/…
      猜你喜欢
      • 2015-02-21
      • 2019-10-27
      • 2021-01-04
      • 2019-04-16
      • 2013-11-25
      • 1970-01-01
      • 2018-01-12
      • 2017-05-26
      相关资源
      最近更新 更多