我们假设我有一个Player
集合,而在Game
的上下文中,它会限制他们的games
数组只包含该游戏。
Meteor.publish('gamePlayer', function (playerId, gameId) {
check(playerId, String);
check(gameId, String);
if (Roles.userIsInRole(this.userId, Roles.getAllRoles().fetch(), gameId)) {
return Players.find({
_id: playerId,
games: {
$elemMatch: {
id: gameId
}
}
}, {
fields: {
"games.$": 1
}
});
}
});
现在我回到了我期望回到客户端的结构。
// server
> Players.findOne({ _id: "123456" });
{
_id: "123456",
battletag: "corvid#1234",
games: [{
id: "5678",
name: "Starcraft II",
class: "Zerg",
ladder: 23
}, {
id: "1234",
name: "World of Warcraft",
class: "Shaman",
ladder: 123
}]
}
// client
> var params = Router.current().params;
> Meteor.subscribe('gamePlayer', params.gameId, params.playerId);
> Players.findOne();
{
_id: "123456",
battletag: "corvid#1234",
games: [{
id: "5678",
name: "Starcraft II",
class: "Zerg",
ladder: 23
}]
}
我感到困惑的是,当您以可靠的方式限制反馈结果时,如何更新对象数组。例如,我想将有限字段class
更改为Protoss
。
如果字段有限,如何在流星上的客户端上安全地更新对象数组?
答案 0 :(得分:2)
只要您更新了正确的games.id
。
Players.update(
{
_id: "123456",
"games.id": 5678
},
{
$set: {
"games.$.class" : "Protoss"
}
}
)
客户端仅在服务器上完成真正的更新时模拟minimongo上的更新。无论服务器上的哪些更改都会传播回客户端。