2015-04-15 45 views
4

我已经购买了发现流星书并通过了本教程。我仍然不确定几个部分,并遇到了一个我无法工作的问题。如何从Meteor的不同集合中的特定字段返回值?

我有两个集合。

Computers = new Mongo.Collection('computers'); 
Apps = new Mongo.Collection("apps"); 

在我发布的服务器:

Meteor.publish('computers', function() { 
    return Computers.find(); 
}); 

Meteor.publish('apps', function() { 
    return Apps.find(); 
}); 

在客户订阅使用铁路由器:

Router.configure({ 
    waitOn: function() { 
    return [Meteor.subscribe('computers'), 
      Meteor.subscribe('apps'), 
      Meteor.subscribe('users')]; 
    } 
}); 

在一个集合我已经引用的文件与另一个文件的ID在另一个集合中。

Computers.insert({ 
    _id: sd9f9sdf699, 
    name: 'Mac1' 
}); 

Apps.insert({ 
    _id: ewf4y34349f, 
    name: 'App One', 
    version: '1.0', 
    computerId: sd9f9sdf699 
}); 

然后我使用的是{{#each}}块通过在应用程序集合中的文件进行迭代

{{#each apps}} 
    {{> appItem}} 
{{/each} 

<template name="appItem"> 
    <tr> 
    <td><input type="checkbox" name="checked" class="ui checkbox"></td> 
    <td>{{name}}</td> 
    <td>{{version}}</td> 
    <td>{{computerName}}</td> 
    </tr> 
</template> 

,当我到了computerId领域,我想匹配在计算机集合中记录文件,然后返回计算机的名称而不是id。

这里是我的app_item.js代码:

Template.appItem.helpers({ 
    computerName: function() { 
    var id = this.computerId; 
    var compName = Computers.find({_id: id}, {fields: {name: 1} }).fetch(); 
    return compName; 
    } 
}); 

我显然失去了一些东西,但我似乎无法环绕它是什么我的头。

如果可能,我会更喜欢一个答案,会教我什么,我做错了,而不是一个副本&粘贴解决方案如何解决它。我似乎有一个理解这个问题,并会感谢任何意见什么编程理论,我应该审查。

感谢您的阅读! Piotr

回答

4

你的帮助代码应该使用findOne()而不是find()函数。 find()返回具有返回数组的函数fetch()的coursor。 findOne()返回一个文档。

Template.appItem.helpers({ 
    computerName: function() { 
    var comp = Computers.findOne(this.computerId, {fields: {name: 1} }); 
    return comp.name; 
    } 
}); 

这是如何处理Meteor中的连接的一种方式。我找到了更好的方法:http://meteor.hromnik.com/blog/joins-in-meteorjs-and-mongodb

2

您可以考虑的一件事是将您的datamodel更改为更多的mongo样式文档结构,您将computerid + computername同时存储在应用程序集合中。这样可以防止额外的查询,唯一的缺点是当您更改特定应用程序文档中的计算机值时,需要更新2个字段而不是1个。 然后,您可以简单地显示与{{计算机名}}计算机名,而不需要一个帮手。

你也可以存储在计算机集合在阵列中的每个应用程序的计算机的关系,因此您可以轻松地请求一定的计算机上的所有安装的应用程序,而无需运行每个应用程序额外查询。但是在这种情况下这并不是真的需要,因为这两个集合包含的字段非常少,您可以通过简单的mongo查询来获取所有应用程序。另一种有用的字段(只是猜测)可能是计算机文件中像installedAppsAmount所以你可以列出每个coputer应用程序的数量,无需额外的查询。 所有这些都基于假设,并且取决于你的用例。

希望这是有用的为您服务。

林不知道为什么你的例子不工作寿在此基础上的信息:在您的帮助this.computerId正确的,什么是如果你在控制台显示它COMPNAME回来?

+0

谢谢你的回答。我宁愿让它与单独的集合一起工作,因为我在应用程序的其他部分也遇到同样的问题,例如将计算机分配给用户,将附件(例如pdf)分配给应用程序,用户或计算机。我也明白,这不是像Mongo这样的数据存储的理想方式,但我决定学习Meteor而不是使用Rails + SQL路线。为了缩短这篇文章,我还削减了很多代码。 Console.log(compName)返回一个对象。然后,我也尝试使用{{computerName.name}},但也没有工作。 –

+0

好的,既然它是一个对象,你必须通过循环来获得你需要的值,但是因为它总是只有1个结果,所以你可以使用findOne作为他在答案中提到的Tomas,只返回1个结果作为数组并返回。 – kiewietr

相关问题