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

时间:2015-04-15 09:17:24

标签: mongodb 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订阅的客户端上:

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;
  }
});

我显然在这里遗漏了一些东西,但我似乎无法理解它是什么。

如果可能的话,我会更喜欢一个可以教会我做错的答案,而不是副本&amp;粘贴如何解决它的解决方案。我似乎有一个问题理解这一点,并希望任何建议我应该审查的编程理论。

感谢阅读! 彼得

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

希望这对你有用。

我不确定为什么你的例子根据这个信息不起作用:你的帮助器中的this.computerId是否正确,如果你在控制台中显示它,返回的是什么是compname?