流星集合:如何连接到相互引用的不同集合?

Meteor collections: how to connect to different collections referring to each other?

我有两个合集:

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.

这里的"contract"-name指的是contract-collection中的一个"contract"-name。我们可以将多个提醒连接到同一个合约。因此我希望它们在两个不同的集合中。

要获取我使用的合同数据:

<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() {
    //?
  }
});

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

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

评估 reminders 时的当前数据上下文将是当前迭代的合约,因此我们可以使用 this.contract.

访问其合约名称

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

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

你最好使用 Contracts._id 来引用 Reminders 集合中的合同,如果合同名称和描述在某个时候发生变化,你将不需要更新所有相关提醒。

合同:

{
  "_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 函数只需要 return Contracts.findOne({contract: this.contract})

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

此包提供了灵活的方式来使用反应式联接从各种集合中发布一组相关文档。希望对你有帮助。