Mongodb Meteor.js中的Mongo DB更新查询
我有以下Meteor.js收藏: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,
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数组。我只是想知道有没有更简单的方法。我也曾想过做一次巡回募捐,但最终决定不做。