如何访问Meteor中从Mongo查询的对象的属性

时间:2013-09-10 05:11:38

标签: mongodb meteor

我对Meteor.js框架中的mongo很新。在这里,我使用它的ID查询了一个MongoDB对象。我正在尝试访问属性“mana”,但它返回我未定义。

var skill = Skills.find({_id:Session.get("selected_skill")});
  alert(skill);//This returns me "undefined"
  Skills.update(Session.get("selected_skill"), {$inc: {mana: 1}});

您能否告诉我有关在mongo中访问meteoro属性的要求?感谢

1 个答案:

答案 0 :(得分:6)

find方法返回游标,而不是对象和数组。要访问对象,您需要从光标

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

或直接使用findOne

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

然后您可以像使用任何其他js对象一样使用它:

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


请记住,在客户端,find等收集方法是非阻塞的。它们返回Meteor在缓存中的任何内容,而不一定是服务器端db中的内容。这就是为什么你应该总是在一个被动的上下文中使用它们,或者确保在执行之前已经获取了所有数据(在你熟悉Meteor之前不要担心后者,从第一种方式开始)。

此外,您需要记住,因为这样,findOnefind.fetch可能会返回null /空数组,即使相应的元素位于db(但是还没有'尚未缓存)。如果您在反应函数中没有考虑到这一点,那么您将遇到错误。

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

如果我们没有使用if(!article)从函数中逃脱,则表达式article.title会在第一次计算中引发错误,因为article将是未定义的(假设它不是先前缓存了。)


如果要从客户端更新数据库,则一次只能更改一个项目,并且必须通过_id引用该项目。这是出于安全原因。你的专线还可以:

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


alert()返回未定义的函数,无论您提供什么。

alert(42); // -> undefined

通常,使用console.log调试比使用alert更好。