我有两个系列:
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() {
//?
}
});
答案 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._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
函数只需要返回Contracts.findOne({contract: this.contract})
答案 2 :(得分:1)
https://atmospherejs.com/reywood/publish-composite
此软件包提供了灵活的方法,可以使用响应式连接从各种集合中发布一组相关文档。希望它有所帮助。