MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come si accede agli attributi di un oggetto interrogato da Mongo in Meteor

find il metodo restituisce un cursore, non un oggetto né un array. Per accedere all'oggetto, devi recuperarlo dal cursore

var skill = Skills.find(Session.get('selected_skill')).fetch()[0];

oppure scaricalo direttamente con findOne :

var skill = Skills.findOne(Session.get('selected_skill'));

Quindi puoi usarlo come qualsiasi altro oggetto js:

console.log(skill.mana);
skill._cache = {cooldown: true};

Tieni presente che sul lato client, metodi di raccolta come find sono non bloccanti. Restituiscono tutto ciò che Meteor ha nella cache, non necessariamente ciò che è nel db lato server. Ecco perché dovresti sempre usarli in un contesto reattivo, o assicurarti che tutti i dati siano stati recuperati prima dell'esecuzione (non preoccuparti di quest'ultimo fino a quando non sarai fluente con Meteor, inizia con il primo modo).

Inoltre, devi tenere presente che per questo motivo findOne e find.fetch può restituire null / array vuoto, anche quando l'elemento corrispondente è in db (ma non è stato ancora memorizzato nella cache). Se non lo prendi in considerazione nelle tue funzioni reattive, ti imbatterai in errori.

Template.article.slug = function() {
    var article = Articles.findOne(current_article);
    if(!article) return '';
    return slugify(article.title);
};

Se non siamo scappati dalla funzione con if(!article) , l'espressione article.title genererebbe un errore nel primo calcolo, come article sarebbe indefinito (supponendo che non sia stato memorizzato nella cache in precedenza).

Quando vuoi aggiornare il database dal lato client, puoi modificare solo un elemento alla volta e devi fare riferimento all'elemento tramite il suo _id . Ciò è dovuto a motivi di sicurezza. La tua linea per questo era ok:

Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});

alert() è una funzione che restituisce indefinito, non importa cosa gli dai da mangiare.

alert(42); // -> undefined

In genere è lontano meglio eseguire il debug con console.log che con alert .