关于如何在我的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设置多个验证方案?
非常感谢任何想法/建议!!!
答案 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包含我想要的结果数据,我可以分别从每个集合中决定我想要的数据。
一个缺点是我显然是在复制数据 - 有些(如果不是所有这些记录都存在于客户端上......)