两个mongo集合之间的关系。
我有2个集合:条目和标签:
// example Entry
{
"_id": "4ZCBv5ogLStfFxpvp",
"title": "Some other title",
"entryLabels": [
"TFrYvEujpqbMryWEZ",
"rn8Z57NsEYse7nYTo",
"rn8Z57NsEYse73YTo"
],
"author": "TMviRL8otm3ZsddSt",
"createdAt": "2016-01-16T15:21:43.153Z",
"date": "2016-01-16T15:21:43.153Z"
}
// Example Label
{
"_id": "9NCNPGH8F5MWNzjkA",
"color": "#333",
"name": "Grey Label",
"author": "TMviRL8otm3ZsddSt"
}
由于可以为条目设置多个标签,因此我将标签ID保留在该条目标签字段中。 我的计划是只保存标签ID,然后根据它查询标签集合。
如果我有一个labelID,这是可以的,因为我可以根据该ID查询Labels集合并返回一个标签。但是我有一系列ID,我必须返回多个标签。
我的尝试是这样的(在模板助手中):
labels: function(event){
var entryLabels = this.entryLabels;
var arr = []
for(i = 0; i < entryLabels.length; i++) {
var label = entryLabels[i];
var theLabel = Labels.find({_id: entryLabels[i]}).fetch();
arr.push(theLabel);
}
return arr;
}
然后,在模板中:
{{#each labels}}
{{name}}
<p>asd</p>
{{/each}}
这会返回'asd'3次,但我无法访问名称
等标签属性所以,我想我的问题是,如何访问这些属性。 还有..我这样做是正确的吗?
答案 0 :(得分:1)
我正在以正确的方式做这件事吗?
我会说不。使用几乎任何其他数据库的mongo,您可以一次检索多个文档。为什么可以在for-loop
中一次取一个
labels: function(event){
var entryLabels = this.entryLabels;
var arr = Labels.find({_id: {$in: entryLabels}}).fetch();
return arr;
}
这也会修复“我无法访问名称等标签属性”问题,因为旧的arr
是数组 数组 文档,而不是您期望的文档数组。
答案 1 :(得分:0)
明智的数据重复可以成为创建最佳文档数据库模式的一部分。话虽如此,马丁的答案应该是好的。 Labels.find().fetch()
是Meteor Mongo Labels集合上的Meteor方法,而不是Mongo Labels Collection上的异步MongoDb查找。