Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Meteor.js中的Mongo DB更新查询_Mongodb_Meteor - Fatal编程技术网

Mongodb Meteor.js中的Mongo DB更新查询

Mongodb Meteor.js中的Mongo DB更新查询,mongodb,meteor,Mongodb,Meteor,我有以下Meteor.js收藏: Game: { _id: 1, rounds: { round: { number: 1, players: { player: { _id: someId, cardSelection: someCard } player: { _id: someId2,

我有以下Meteor.js收藏:

Game: { 
  _id: 1,
  rounds: {
     round: {
        number: 1,
        players: {
           player: {
             _id: someId,
             cardSelection: someCard
           }
           player: {
             _id: someId2,
             cardSelection: someCard2
           }
        }
     }
  }
集合中还有一些其他字段,但这些字段很重要。当玩家点击一张牌时,我试图更新玩家的选择。我不确定如何在MongoDB/Meteor中做到这一点

到目前为止,我已经尝试: var currentRound=Games.findOne(gameId).rounds.length

Games.update({_id: gameId,
              "rounds.round": currentRound,
              "rounds.round.$.players": playerId
              }, 
              {$set: 
                  {"rounds.$.players.$": {id: playerId, selection: selection}}
              }
             );
问题是,当调用更新时,我不知道轮次的位置(我知道,这是最后一轮,但轮次号会改变),我也不知道玩家在轮次对象中的位置


有什么帮助吗?

假设
游戏
文档采用这种结构,则无法使用位置更新操作符直接更新玩家

{
_id:1,
轮次:[{
编号:1,
玩家:[{
_id:‘someId’,
卡片选择:'someCard'
}, {
_id:'someId2',
卡片选择:“someCard2”
}]
}, {
编号:2,
玩家:[]
}]
}
从:

位置$operator不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$placeholder的替换项是单个值

虽然没有那么优雅,但你可以设置整个玩家阵列。幸运的是,这使事情变得容易

var game=Games.findOne(gameId);
var currentRound=game.rounds.length;
var round=u.findWhere(game.rounds,{number:currentRound});
//查找并修改受影响的玩家
round.players=\地图(round.players,函数(player){
如果(player.id==playerId){
player.cardSelection=selection;
}
返回球员;
});
Games.update({
_id:gameId,
“轮数”:当前轮数
}, {
$set:{“轮数.$.players”:轮数.players}
});

或者,您可以将
回合
分成一个单独的集合。

我认为您的
游戏
文档中有错误。
rounds
players
都应该是数组吗?它们都是对象数组。我目前正在使用下划线设置整个players数组。我只是想知道有没有更简单的方法。我也曾想过做一次巡回募捐,但最终决定不做。