2014-02-03 3 views
0

Я пытаюсь сделать пример лидеров Meteor, и я застрял во втором упражнении, сбросив оценки. До сих пор дальше у меня есть это:Пример: Meteor Leaderboard: сброс очков

// 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 У меня есть раздел, как это в случае (Meteor.isClient)

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

Проблема с этим что {} должен выбрать все документы в коллекции MongoDB, но вместо этого он создает нового пустого ученого со случайным счетом. Зачем? {} должен выбрать все. Я попробовал «_id»: {$ exists: true}, но я думаю, что это kludge. Плюс он вел себя так же, как {}.

Есть ли более элегантный способ сделать это? Метеорный веб-страницы говорит:

Make a button that resets everyone's score to a random number. (There is already code to do this in the server startup code. Can you factor some of this code out and have it run on both the client and the server?)

Ну, чтобы запустить это на клиенте первым, вместо того, чтобы использовать метод на сервере и иметь результаты оттеснили к клиенту, я должен был бы явно указать _ids каждого документ в коллекции, иначе я столкнулся с «Ошибка: не разрешено». Неверный код может обновлять документы только по идентификатору. [403] ». Но как я могу это получить? Или я должен просто сделать это легко и использовать collection.allow()? Или это единственный способ?

+0

http://docs.mongodb.org/manual/reference/method/db.collection.update/ –

ответ

1

Я думаю, что вам не хватает двух вещей:

  1. вам нужно передать параметр, {multi: true}, чтобы обновить или он будет только когда-либо изменить одну запись.

  2. Если вы хотите изменить только некоторые поля документа, вам необходимо использовать $set. В противном случае обновление предполагает, что вы предоставляете полный новый документ и хотите заменить оригинал.

Так что я думаю, что правильная функция:

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

documentation на это довольно тщательно.

Смежные вопросы