MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie greifen Sie auf Attribute eines Objekts zu, das von Mongo in Meteor abgefragt wird?

find Die Methode gibt einen Cursor zurück, weder ein Objekt noch ein Array. Um auf das Objekt zuzugreifen, müssen Sie es entweder vom Cursor holen

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

oder direkt mit findOne abrufen :

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

Dann können Sie es wie jedes andere js-Objekt verwenden:

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

Denken Sie daran, dass auf Clientseite Sammelmethoden wie find sind nicht blockierend. Sie geben das zurück, was Meteor im Cache hat, nicht unbedingt das, was sich in der serverseitigen Datenbank befindet. Aus diesem Grund sollten Sie sie immer in einem reaktiven Kontext verwenden oder sicherstellen, dass alle Daten vor der Ausführung abgerufen wurden (machen Sie sich um letzteres keine Sorgen, bis Sie Meteor fließend beherrschen, beginnen Sie mit dem ersten Weg).

Außerdem müssen Sie daran denken, dass aus diesem Grund findOne und find.fetch kann null zurückgeben / leeres Array, auch wenn das entsprechende Element in db ist (aber noch nicht zwischengespeichert wurde). Wenn Sie das in Ihren reaktiven Funktionen nicht berücksichtigen, werden Sie auf Fehler stoßen.

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

Wenn wir die Funktion nicht mit if(!article) verlassen haben , der Ausdruck article.title würde bei der ersten Berechnung einen Fehler auslösen, da article wäre undefiniert (vorausgesetzt, es wurde nicht früher zwischengespeichert).

Wenn Sie die Datenbank von der Client-Seite aktualisieren möchten, können Sie jeweils nur ein Element ändern, und Sie müssen auf das Element anhand seiner _id verweisen . Dies hat Sicherheitsgründe. Deine Zeile dafür war ok:

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

alert() ist eine Funktion, die zurückgibt undefiniert, egal was du fütterst.

alert(42); // -> undefined

Im Allgemeinen ist es weit besser mit console.log debuggen als mit alert .