我一直在尝试做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()?或者这是唯一的方法吗?
答案 0 :(得分:1)
我认为你错过了两件事:
您需要通过选项{multi: true}
进行更新,否则只会更改一条记录。
如果您只想更改文档的某些字段,则需要使用$set
。否则,更新假定您提供所需的完整新文档并替换原始文档。
所以我认为正确的功能是:
Players.update({},{$set: {score: Math.floor(Random.fraction()*10)*5}}, {multi:true});
documentation对此非常透彻。