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

Mel*_*Goh 4 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}});
Run Code Online (Sandbox Code Playgroud)

你能告诉我关于在mongo中访问meteor属性的要求吗?谢谢

Hub*_* OG 6

find方法返回一个游标,而不是对象和数组.要访问对象,您需要从光标中获取它

var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
Run Code Online (Sandbox Code Playgroud)

或直接获得findOne:

var skill = Skills.findOne(Session.get('selected_skill'));
Run Code Online (Sandbox Code Playgroud)

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

console.log(skill.mana);
skill._cache = {cooldown: true};
Run Code Online (Sandbox Code Playgroud)

 


 

请记住,在客户端,收集方法就像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);
};
Run Code Online (Sandbox Code Playgroud)

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

 


 

如果要从客户端更新数据库,则一次只能更改一个项目,并且必须按其引用该项目_id.这是出于安全原因.你的这条线是好的:

Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
Run Code Online (Sandbox Code Playgroud)

 


 

alert()是一个函数,无论你喂它什么,它都会返回 undefined.

alert(42); // -> undefined
Run Code Online (Sandbox Code Playgroud)

一般来说,这是远远更好地与调试console.logalert.