Meteor.js - 用户搜索多个集合的方法

时间:2013-12-13 11:35:57

标签: mongodb meteor

关于如何在我的Meteor应用程序中设置集合,我有点困惑。用户搜索栏是我的应用程序的核心部分,用户需要能够输入一个搜索并在多个不同的集合中获得结果:

user query : 'foo'

var query = 'foo';
var actors_results = Actors.find({ $or : [{ name : query}, { actor_biography : query }] );
var films_results = Films.find({ $or : [{ name : query}, { description : query }] );
var cinemas_results = Cinemas.find({ $or : [{ name : query}, { genres : query }] );

对于搜索结果显示这不好 - 我不认为(???)我可以将这些游标组合成一个游标,所以像分页一样简单的事情变得几乎不可能(或者我不知道如何这样做。)

我知道的唯一解决方案是创建一个SuperCollection,我放置所有文档,并有一个字段'类型',可以是'演员','电影'或'电影',然后分页等变得容易。< / p>

但在我看来,这确实使其他一切变得复杂......数据库的结构不再反映数据。演员和电影院在数据/结构方面没有任何共同之处,我只需要能够并行搜索它们。

另外,如何根据字段'type'的值为SuperCollection设置多个验证方案?

非常感谢任何想法/建议!!!

1 个答案:

答案 0 :(得分:1)

好的,我已经找到了一种方法来做到这一点,而无需重新整理我的整个数据库。 Bravo Meteor!

在服务器上:

Meteor.publish('search_results', function(query){
    if(query){
        var self = this;
        var actors = Actors.find({ $or : [{ name : query}, { actor_biography : query }] ),
        films = Films.find({ $or : [{ name : query}, { actor_biography : query }] ),
        cinemas = Cinemas.find({ $or : [{ name : query}, { actor_biography : query }] );
        actors.forEach(function(doc){
            self.added('search_collection', doc._id, { name : doc.name, type : 'actor' });
        });
        films.forEach(function(doc){
            self.added('search_collection', doc._id, { name : doc.name, type : 'film' });
        });
        cinemas.forEach(function(doc){
            self.added('search_collection', doc._id, { name : doc.name, type : 'cinema' });         
        this.ready();
    } else {
        this.ready();
    }
});

并在客户端:

Deps.autorun(function(){
    Meteor.subscribe('search_results', Session.get('currentQuery'));
});

SearchCollection = new Meteor.Collection('search_collection');

现在,SearchCollection包含我想要的结果数据,我可以分别从每个集合中决定我想要的数据。

一个缺点是我显然是在复制数据 - 有些(如果不是所有这些记录都存在于客户端上......)