使用_id引用数组对多个相应文档进行高效查询

时间:2014-12-08 15:43:49

标签: javascript mongodb meteor mongodb-query

我试图闯入流星。这是我在我的一个模板中的帮手:

genres: function() {
  return Genres.find();
}

返回的内容如下:

[{ "name" : "Action", "_id" : "CHP8uaSPNwKTj6gn7" },
{ "name" : "Thriller", "_id" : "8hKRp3LmgcD6gPRXf" }]

我在同一个模板中还有另一个辅助函数:

authors: function() {
  return Authors.find();
}

返回的内容如下:

[{ "name" : "Robert Ludlum", "genre" : [  "CHP8uaSPNwKTj6gn7",  "8hKRp3LmgcD6gPRXf" ]}]

当我想用HTML显示作者及其类型时,问题就变得清晰了:

{{#each authors}}
  <p> Author: {{name}} </p>
  <p> Genres: {{genre}} </p>
{{/each}}

正如您已经猜到的那样,导致:

Author: Robert Ludlum
Genres: CHP8uaSPNwKTj6gn7, 8hKRp3LmgcD6gPRXf

这是不可取的。这会更好:

Author: Robert Ludlum
Genres: Action, Thriller

我很难搞清楚如何实现这一目标。我没有很多关于这个NoSQL的经验,而且我所看到的例子在这种情况下无益。

那我该如何解决这个问题呢?

2 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题。一个是添加一个帮手,如:

Template.myTemplate.helpers({
  genreNames: function() {
    var genres = Genres.find({_id: {$in: this.genre}}).fetch();
    var names = _.pluck(genres, 'name');
    return names.join(', ');
  }
});

将模板修改为如下所示:

{{#each authors}}
  <p> Author: {{name}} </p>
  <p> Genres: {{genreNames}} </p>
{{/each}}

帮助程序有效,因为它在#each内部运行,所以它的上下文是作者。

或者,您可以在收藏中添加transform或使用collection-helpers。这样,您就可以向所有作者实例添加虚拟属性,因此您可以执行以下操作:Authors.findOne().genreNames()

答案 1 :(得分:0)

在大气层中有一个名为publish-compositehttps://atmospherejs.com/reywood/publish-composite的包,可以让你做你想做的事。

它允许您使用主要集合和其他集合中的相关数据选择多个集合。