Javascript 流星收集故障

Javascript 流星收集故障,javascript,collections,meteor,Javascript,Collections,Meteor,首先,很抱歉我是一个完整的JavaScriptNoob,我更喜欢PHP,我正在测试meteor框架 我尝试循环遍历对象集合,并尝试从其他集合添加属性,如下所示: Template.host.hosts = function() { var hosts = Hosts.find(); hosts.forEach(function(host) { host.lastPing = Pings.findOne({id: host.id}, {sort: {timesta

首先,很抱歉我是一个完整的JavaScriptNoob,我更喜欢PHP,我正在测试meteor框架

我尝试循环遍历对象集合,并尝试从其他集合添加属性,如下所示:

Template.host.hosts = function() {
    var hosts = Hosts.find();

    hosts.forEach(function(host) {
        host.lastPing = Pings.findOne({id: host.id}, {sort: {timestamp : -1}});

        // This works fine
        // console.log(host.lastPing.id);
    });

    for (host in hosts) {

        // This results in "TypeError: Cannot read property 'id' of undefined"
        console.log(host.lastPing.id);
    }

    return hosts;
};
我不明白为什么第二个console.log不工作

我尝试过搜索,但我不知道问题是否与meteor处理集合的方式有关,或者我应该向javascript对象添加属性的方式,或者完全无关的东西(范围等…)

我简化了我的问题,试图了解发生了什么,我真正的问题显然是在模板中循环,如下所示:

{{#each hosts}}
    {{this.lastPing.id}}
{{/each}}
谢谢三件事:

  • MongoDB和Meteor id存储在
    \u id
    中,而不是
    id

  • 在您的
    forEach
    方法的上下文中,
    host
    迭代通过
    Hosts.find()
    返回的查询集,但实际上它不允许您访问文档本身。本质上,它是MongoDB中信息的副本,而不是数据库中的文档

    更新实际文档的正确(也是唯一)方法是使用以下方法:

    (请注意,您只能在客户端上通过
    \u id
    进行更新,这就是我在这里使用的原因,而您可以在服务器上提供任何查询。)

  • hosts
    对象是光标而不是数组。这意味着,当您在hosts中对host使用
    时,实际上是在遍历游标对象的属性(从原型继承而来)而不是主机数组,并且没有一个主机具有id属性。执行此操作的一种方法是获取查询集并将其放入
    hosts
    ,如下所示:

    var hosts = Hosts.find().fetch();
    
    或者,您可以按住光标并再次使用
    forEach
    ,不过您必须使用
    hosts.rewind()
    ,或者重复上面的行以将其重置为查询集的开头


  • 希望这会有帮助

    非常感谢主持人。更新成功了,我将不得不重新阅读这篇详细的文章几次,以便完全理解。
    var hosts = Hosts.find().fetch();