流星集合:如何连接彼此引用的不同集合?

时间:2015-06-15 20:20:38

标签: meteor meteor-helper meteor-collections

我有两个系列:

Contracts = new Mongo.Collection('contracts');
Reminders = new Mongo.Collection('reminders');

这些在数据库中的结构或多或少是这样的:

合同:

{
  "id": "4432234",
  "contract": "C-42432432",
  "description": "Description of contract",
  "counterpart": "Company name",
  "status": "awarded"
},
etc.

提醒:

{
  "name": "Contract expiring",
  "type": "expiring",
  "contract": "C-42432432",
  "reminderDate": "2015-06-01",
  "urgency": 3
},
etc.

此处的“合同” - 名称是指合同集合中的“合同”名称。我们可以提供与同一合同相关的多个提醒。因此,我希望它们分为两个不同的系列。

获取我使用的合同数据:

<template name="example">
{{#each contracts}}
    {{description}}
{{/each}}
</template>

相应的js:

Template.example.helpers({
  contracts: function() {
    return Contracts.find();
  }
});

这个工作正常,此实例中的结果是Description of contract

但是,如果我想显示提醒集合并从合约集合中获取相应数据,该怎么办?换句话说:我想循环提醒集合并获得相同的输出。

<template name="notworking">
{{#each reminder}}
    {{description}}
    <!-- Here I want the description from the Contract-collection -->
{{/each}}
</template>

相应的js:

Template.notworking.helpers({
  reminder: function() {
    //?
  }
});

3 个答案:

答案 0 :(得分:1)

我假设您需要遍历循环中的每个提醒,迭代每个合同:

<template name="contracts">
  {{#each contracts}}
    <p>{{description}}</p>
    {{#each reminders}}
      <p>{{description}}</p>
    {{/each}}
  {{/each}}
</template>

评估reminders时的当前数据上下文将是当前迭代的合同,因此我们可以使用this.contract访问其合同名称。

因此,您只需返回具有相同合同名称的每个提醒文档。

Template.contracts.helpers({
  reminders: function(){
    return Reminders.find({
      contract: this.contract
    });
  }
});

答案 1 :(得分:1)

如果合同名称和说明在某些时候发生变化,您可能最好使用Contracts._idReminders集合中引用合同,而无需更新所有合同相关提醒。

合同:

{
  "_id": "tPN5jopkzLDbGypBu",
  "contract": "C-42432432",
  "description": "Description of contract",
  "counterpart": "Company name",
  "status": "awarded"
},

提醒:

{
  "name": "Contract expiring",
  "type": "expiring",
  "contractId": "tPN5jopkzLDbGypBu",
  "reminderDate": "2015-06-01",
  "urgency": 3
},

然后,如果您想列出提醒并显示您有相关合同信息:

HTML:

<template name="remindersList>
{{#each reminder}}
  Date: {{reminderDate}} Urgency: {{urgency}}
  {{#with relatedContract}}
    Description: {{description}} Counterpart: {{counterpart}} Status: {{status}}
  {{/with}}
{{/each}}
</template>

JS:

Template.remindersList.helpers({
  reminder: function(){
    return Reminders.find(); // or whatever query you need to run
  },
  relatedContract: function(){
    return Contracts.findOne({_id: this.contractId}); // 'this' will be the Reminder document
  }
});

或者 - 如果您想保留非规范化架构,那么relatedContract函数只需要返回Contracts.findOne({contract: this.contract})

答案 2 :(得分:1)

https://atmospherejs.com/reywood/publish-composite

此软件包提供了灵活的方法,可以使用响应式连接从各种集合中发布一组相关文档。希望它有所帮助。