按ID匹配集合项

时间:2016-01-16 17:25:28

标签: javascript mongodb meteor

两个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次,但我无法访问名称

等标签属性

所以,我想我的问题是,如何访问这些属性。 还有..我这样做是正确的吗?

2 个答案:

答案 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查找。