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

Efficient queries for multiple corresponding documents using an array of _id references

本文关键字:文档 查询 高效 id 引用 数组 使用      更新时间:2023-09-26

我正在尝试摸索流星。这是我的一个模板中的帮助程序:

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的东西没有太多经验,我看到的例子在这种情况下没有帮助。

那么我该如何做到这一点呢?

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

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内部,因此它的上下文是作者。

或者,可以将转换添加到集合或使用集合帮助程序。这样,您就可以向所有创作实例添加虚拟属性,以便执行以下操作:Authors.findOne().genreNames() .

在大气中有一个叫做 publish-composite ,https://atmospherejs.com/reywood/publish-composite 应该可以让您做您所追求的事情。

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