Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何访问Meteor中从Mongo查询的对象的属性_Mongodb_Meteor - Fatal编程技术网

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

Mongodb 如何访问Meteor中从Mongo查询的对象的属性,mongodb,meteor,Mongodb,Meteor,在Meteor.js框架中,我对mongo还很陌生。在这里,我使用MongoDB对象的ID查询了它。我试图访问属性“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}});

在Meteor.js框架中,我对mongo还很陌生。在这里,我使用MongoDB对象的ID查询了它。我试图访问属性“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中访问meteor属性的要求吗?谢谢

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之前,不要担心后者,从第一种方法开始)

此外,您需要记住,正因为如此,
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
将未定义(假设它之前未缓存)


当您想从客户端更新数据库时,一次只能更改一个项目,并且必须通过其
\u id
引用该项目。这是出于安全原因。你的这句话还可以:

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


alert()
是一个函数,它返回undefined,无论您向它提供什么

alert(42); // -> undefined

通常,使用
console.log
进行调试比使用
alert
进行调试要好得多,谢谢Hubert!!这对检索非常有帮助。您是否也知道使用外部sql查询工具连接Meteor生产数据库的方法?在这种情况下,我不是在看命令级编辑,谢谢你的回答,特别是解释了
.find
提供了一个光标,而
.findOne
没有