4

我对 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中访问流星属性的要求吗?谢谢

4

1 回答 1

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 缓存中的任何内容,不一定是服务器端数据库中的内容。这就是为什么您应该始终在反应式上下文中使用它们,或者确保在执行之前已获取所有数据(在您熟练使用 Meteor 之前不要担心后者,从第一种方式开始)。

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

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()是一个无论你提供什么都返回undefined的函数。

alert(42); // -> undefined

一般来说,用 调试要比用调试好得多console.logalert

于 2013-09-10T06:39:59.400 回答