我对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属性的要求?感谢
答案 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之前不要担心后者,从第一种方式开始)。
此外,您需要记住,因为这样,findOne
和find.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
更好。