Meteor Leaderboard示例:重置分数

时间:2014-02-03 15:13:36

标签: javascript node.js mongodb meteor

我一直在尝试做Meteor的排行榜示例,我坚持第二次练习,重置分数。到目前为止,我得到的最远的是:

// On server startup, create some players if the database is empty.
if (Meteor.isServer) {
  Meteor.startup(function () {
    if (Players.find().count() === 0) {
      var names = ["Ada Lovelace",
                   "Grace Hopper",
                   "Marie Curie",
                   "Carl Friedrich Gauss",
                   "Nikola Tesla",
                   "Claude Shannon"];
      for (var i = 0; i < names.length; i++)
        Players.insert({name: names[i]}, {score: Math.floor(Random.fraction()*10)*5});
    }
});
Meteor.methods({
  whymanwhy: function(){
    Players.update({},{score: Math.floor(Random.fraction()*10)*5});
  },
}
)};

然后使用whymanwhy方法我在if(Meteor.isClient)中有这样的部分

Template.leaderboard.events({
    'click input#resetscore': function(){Meteor.call("whymanwhy");    }
});

问题在于{}应该选择MongoDB集合中的所有文档,而是创建一个具有随机分数的新空白科学家。为什么? {}应该选择一切。我试过“_id”:{$ exists:true},但我认为这是一个kludge。此外,它的行为与{}相同。

有更优雅的方法吗?流星网页说:

  

创建一个按钮,将每个人的分数重置为随机数。 (那里   已经是在服务器启动代码中执行此操作的代码。你能考虑一下吗?   一些代码输出,并在客户端和运行时运行   服务器?)

好吧,首先在客户端上运行它,而不是使用方法到服务器并将结果推回到客户端,我需要显式指定集合中每个文档的_ids,否则我将运行进入“错误:不允许。不受信任的代码只能按ID更新文档。[403]”。但是我该怎么做呢?或者我应该让它变得简单并使用collection.allow()?或者这是唯一的方法吗?

1 个答案:

答案 0 :(得分:1)

我认为你错过了两件事:

  1. 您需要通过选项{multi: true}进行更新,否则只会更改一条记录。

  2. 如果您只想更改文档的某些字段,则需要使用$set。否则,更新假定您提供所需的完整新文档并替换原始文档。

  3. 所以我认为正确的功能是:

    Players.update({},{$set: {score: Math.floor(Random.fraction()*10)*5}}, {multi:true});
    

    documentation对此非常透彻。