MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment accéder aux attributs d'un objet interrogé à partir de Mongo dans Meteor

find La méthode renvoie un curseur, pas un objet ni un tableau. Pour accéder à l'objet, vous devez soit le récupérer à partir du curseur

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

ou obtenez-le directement avec findOne :

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

Ensuite, vous pouvez l'utiliser comme n'importe quel autre objet js :

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

Gardez à l'esprit que côté client, les méthodes de collecte telles que find sont non bloquants. Ils renvoient tout ce que Meteor a en cache, pas nécessairement ce qui se trouve dans la base de données côté serveur. C'est pourquoi vous devez toujours les utiliser dans un contexte réactif, ou vous assurer que toutes les données ont été récupérées avant l'exécution (ne vous inquiétez pas pour cette dernière tant que vous ne maîtrisez pas Meteor, commencez par la première).

De plus, vous devez garder à l'esprit qu'à cause de cela, findOne et find.fetch peut retourner null / tableau vide, même lorsque l'élément correspondant est dans la base de données (mais n'a pas encore été mis en cache). Si vous n'en tenez pas compte dans vos fonctions réactives, vous rencontrerez des erreurs.

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

Si nous ne nous sommes pas échappés de la fonction avec if(!article) , l'expression article.title soulèverait une erreur dans le premier calcul, comme article serait indéfini (en supposant qu'il n'ait pas été mis en cache plus tôt).

Lorsque vous souhaitez mettre à jour la base de données côté client, vous ne pouvez modifier qu'un seul élément à la fois et vous devez faire référence à l'élément par son _id . Ceci est dû à des raisons de sécurité. Votre ligne pour ceci était ok :

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

alert() est une fonction qui retourne indéfini, peu importe ce que vous lui donnez.

alert(42); // -> undefined

Généralement, c'est loin mieux vaut déboguer avec console.log qu'avec alert .