【问题标题】:How do I return a value from a specific field in a different collection in Meteor?如何从 Meteor 的不同集合中的特定字段返回值?
【发布时间】:2015-04-15 17:59:56
【问题描述】:

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

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

如果可能的话,我希望得到一个能告诉我我做错了什么的答案,而不是复制和粘贴解决方案的方法。我似乎无法理解这一点,如果我应该复习什么编程理论,我将不胜感激。

感谢阅读! 彼得

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

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

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

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

      希望这对你有用。

      我不确定为什么您的示例无法根据以下信息运行:this.computerId 在您的帮助程序中是否正确,如果您在控制台中显示它,compname 返回的是什么?

      【讨论】:

      • 感谢您的回答。我更愿意让它与单独的集合一起使用,因为我在应用程序的其他部分也有同样的问题,例如将计算机分配给用户,将附件(如 pdf)分配给应用程序、用户或计算机。我也明白这不是使用像 Mongo 这样的数据存储的理想方式,但我决定学习 Meteor 而不是使用 Rails+SQL 路线。我还从上面的代码中删减了很多内容,以使这篇文章更短。 Console.log(compName) 返回一个对象。然后我也尝试使用 {{computerName.name}} 但这也没有用。
      • 好的,因为它是一个对象,你必须遍历它来获得你需要的值,但由于它总是只有 1 个结果,你可以使用 findOne 作为 Tomas 在他的回答中提到的只返回 1 个结果作为一个数组并重新调整它。
      猜你喜欢
      • 1970-01-01
      • 2019-02-11
      • 2014-11-22
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      相关资源
      最近更新 更多