【问题标题】:Meteor Leaderboard example: resetting the scoresMeteor 排行榜示例:重置分数
【发布时间】:2014-09-08 22:37:08
【问题描述】:

我一直在尝试做 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 },但我认为这是一个杂牌。此外,它的行为与 {} 相同。

有没有更优雅的方法来做到这一点?流星网页说:

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

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

【问题讨论】:

标签: javascript node.js mongodb meteor


【解决方案1】:

我认为您缺少两件事:

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

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

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

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

上面的documentation 写得很透彻。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 2017-08-04
    • 2014-06-11
    • 2021-03-04
    • 2016-08-14
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多