sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo accede a los atributos de un objeto consultado desde Mongo en Meteor?

find El método devuelve un cursor, no un objeto ni una matriz. Para acceder al objeto, debe buscarlo desde el cursor

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

u obtenerlo directamente con findOne :

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

Entonces puede usarlo como cualquier otro objeto js:

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

Tenga en cuenta que en el lado del cliente, los métodos de recopilación como find no son bloqueantes. Devuelven lo que Meteor tiene en caché, no necesariamente lo que está en la base de datos del lado del servidor. Es por eso que siempre debe usarlos en un contexto reactivo, o asegurarse de que todos los datos se hayan obtenido antes de la ejecución (no se preocupe por lo último hasta que domine Meteor, comience con la primera forma).

Además, debe tener en cuenta que, debido a esto, findOne y find.fetch puede devolver null / matriz vacía, incluso cuando el elemento correspondiente está en db (pero aún no se ha almacenado en caché). Si no tiene eso en cuenta en sus funciones reactivas, se encontrará con errores.

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

Si no escapamos de la función con if(!article) , la expresión article.title generaría un error en el primer cálculo, como article no estaría definido (suponiendo que no se haya almacenado en caché antes).

Cuando desee actualizar la base de datos desde el lado del cliente, puede modificar solo un elemento a la vez y debe hacer referencia al elemento por su _id . Esto se debe a razones de seguridad. Tu línea para esto estuvo bien:

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

alert() es una función que devuelve indefinido sin importar con qué lo alimentes.

alert(42); // -> undefined

En general, está lejos mejor depurar con console.log que con alert .