Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何从Meteor中不同集合中的特定字段返回值?_Mongodb_Meteor - Fatal编程技术网

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

Mongodb 如何从Meteor中不同集合中的特定字段返回值?,mongodb,meteor,Mongodb,Meteor,我买了《发现流星》这本书,并阅读了教程。我仍然不确定有几个部分,遇到了一个无法工作的问题 我有两个收藏 Computers = new Mongo.Collection('computers'); Apps = new Mongo.Collection("apps"); 在我要发布的服务器上: Meteor.publish('computers', function() { return Computers.find(); }); Meteor.publish('apps', funct

我买了《发现流星》这本书,并阅读了教程。我仍然不确定有几个部分,遇到了一个无法工作的问题

我有两个收藏

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为另一个文档的文档

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

Apps.insert({
  _id: ewf4y34349f,
  name: 'App One',
  version: '1.0',
  computerId: sd9f9sdf699
});
然后,我使用一个{{#each}}块遍历apps集合中的文档

{{#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>
很明显,我在这里遗漏了一些东西,但我似乎不知道它是什么

如果可能的话,我更喜欢一个能告诉我我做错了什么的答案,而不是一个关于如何修复它的复制粘贴解决方案。我似乎在理解这一点上有问题,如果您能给我一些建议,告诉我应该复习什么样的编程理论,我将不胜感激

谢谢你的阅读!
Piotr

< P>你可以考虑的是将数据模型更改为Mango风格的文档结构中的一个,其中存储了计算机应用程序+计算机名称。这可以防止额外的查询,唯一的缺点是,当您更改特定应用程序文档中的计算机值时,需要更新2个字段,而不是1个字段。 然后,您可以简单地用{{computername}}显示computername,而不需要助手

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

希望这对你有用


基于以下信息,我不太清楚为什么您的示例不起作用:帮助程序中的this.computerId正确吗?如果您在控制台中显示它,compname将返回什么?

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

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

这是处理Meteor中连接的一种方法。我找到了更好的方法:

谢谢你的回答。我更愿意让它与单独的集合一起工作,因为我在应用程序的其他部分也有同样的问题,例如将计算机分配给用户,将附件(如pdf)分配给应用程序、用户或计算机。我也明白,对于像Mongo这样的数据存储来说,这不是理想的方式,但我决定学习Meteor,而不是走Rails+SQL路线。我还从上面的代码中删去了很多内容,以缩短这篇文章的篇幅。log(compName)返回一个对象。然后,我还尝试使用{{computerName.name}},但也不起作用。好的,因为它是一个对象,您必须循环通过它来获得所需的值,但由于它总是只有1个结果,您可以使用findOne,正如Tomas在回答中提到的那样,以数组的形式返回1个结果并重新运行它。
Template.appItem.helpers({
  computerName: function() {
    var comp = Computers.findOne(this.computerId, {fields: {name: 1} });
    return comp.name;
  }
});