Javascript 流星排行榜示例:重置分数

Javascript 流星排行榜示例:重置分数,javascript,node.js,mongodb,meteor,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 Lovelac

我一直在尝试做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});
  },
}
)};
问题是{}应该选择MongoDB集合中的所有文档,但是它创建了一个随机分数的新的空白科学家。为什么?{}应该选择所有内容。我尝试了“_id”:{$exists:true},但我认为这是一个难题。加上它的行为与{}相同

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

制作一个按钮,将每个人的分数重置为随机数。(那里 在服务器启动代码中已经有这样做的代码。您可以考虑吗 这些代码中的一部分将被删除,并在客户端和服务器上运行 服务器?)


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

我想你错过了两件事:

  • 您需要传递选项
    {multi:true}
    ,以进行更新,否则它将只更改一条记录

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

  • 因此,我认为正确的功能是:

    Players.update({},{$set: {score: Math.floor(Random.fraction()*10)*5}}, {multi:true});
    
    关于这一点的讨论相当彻底

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