如何返回Meteor中不同集合中特定字段的值



我已经买了Discover 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();
});

在使用Iron路由器订阅的客户端上:

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

在一个集合中,我引用了一个文档,该文档的id与另一个集合的另一个文档的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字段时,我想匹配computers集合中的文档,然后返回计算机的名称而不是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

您的助手代码应该使用findOne()而不是find()函数。find()返回具有函数fetch()的cousor,该函数返回数组。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

您可以考虑的一件事是将您的数据模型更改为更像mongo风格的文档结构,在应用程序集合中存储computered+computername。这样可以防止额外的查询,唯一的缺点是在更改特定应用程序文档中的计算机值时,需要更新2个字段,而不是1个。然后,您可以简单地使用{{computername}}显示计算机名,而无需助手。

您还可以将每个应用程序与计算机的关系存储在计算机集合的数组中,这样您就可以轻松地请求某台计算机上安装的所有应用程序,而无需为每个应用程序运行额外的查询。但在这种情况下,这并不是真正需要的,因为两个集合都包含很少的字段,而且您也可以通过简单的mongo查询获得所有应用程序。另一个有用的字段(只是猜测)可能是计算机文档中的installedAppsMount,这样你就可以在没有额外查询的情况下列出每个计算机上的应用数量。所有这些都是基于假设的,并且实际上取决于您的用例。

希望这对你有用。

基于以下信息,我真的不确定为什么你的示例不起作用:this.computerId在你的助手中正确吗?如果你在控制台中显示它,compname会返回什么?

最新更新