将字段限制到客户端后更新数组中的元素

时间:2015-06-10 14:08:12

标签: mongodb meteor

我们假设我有一个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

如果字段有限,如何在流星上的客户端上安全地更新对象数组?

1 个答案:

答案 0 :(得分:2)

只要您更新了正确的games.id

,就没有问题
Players.update(
  {
    _id: "123456", 
    "games.id": 5678
  }, 
  {
    $set: { 
      "games.$.class" : "Protoss" 
    }
  }
)

客户端仅在服务器上完成真正的更新时模拟minimongo上的更新。无论服务器上的哪些更改都会传播回客户端。