在Meteor模板中对Mongo集合应用多个过滤器

时间:2016-11-14 08:35:26

标签: node.js mongodb meteor collections filter

我正在尝试在Meteor中创建搜索功能。我正在搜索具有特定属性的Mongo集合中的项目。

我的过滤器是反应变量,如下所示:

this.canEnglish = new ReactiveVar(false);
this.canRussian = new ReactiveVar(false);

然后我尝试将这些反应变量用作集合上的过滤器。

Template.Search.helpers({
profiles: ()=> {
    if(Template.instance().canEnglish.get()) {
        return Meteor.users.find({'profile.grammarskills': 'english'}); 
    } else if(Template.instance().canRussian.get()) {
        return Meteor.users.find({'profile.grammarskills': 'russian'});
    } else {
        return Meteor.users.find();
    }
}
});

过滤器的工作方式应该如此,但是如何同时应用多个过滤器,例如在上面的代码中返回可以包含俄语和英语的人?

3 个答案:

答案 0 :(得分:0)

有多种方法可以执行此操作,您可以使用$or$in Mongo运算符。我更喜欢使用$或:

const selector = {
  $or: [],
};

if (canEnglish) {
  selector.$or.push({'profile.grammarskills': 'english'});
}

if (canRussian) {
  selector.$or.push({'profile.grammarskills': 'russian'});
}

return Meteor.users.find(selector);

答案 1 :(得分:0)

这里我添加了两个条件。请根据您的需要选择。

1.//Atleast know one language.
if(canEnglish || canRussian) {
   return Meteor.users.find({$or:['profile.grammarskills': 'english','profile.grammarskills': 'russian']});

2.//Know both the language
} else if(canEnglish && canRussian) {
   return Meteor.users.find({'profile.grammarskills': 'english','profile.grammarskills': 'russian'});
}

答案 2 :(得分:0)

谢谢你的回答。很抱歉,如果我不清楚我的意图,但我想让那些可以使用这两种语言的人从数据库中获取。 Pankaj很接近,但我选择以不同方式解决问题

var selector = [];
if(canEnglish) {selector.push('english');}
if(canRussian) {selector.push('russian');}

if(selector.length > 0) { 
    return Meteor.users.find({'profile.grammarskills': { $all: selector}}); 
} else { 
    return Meteor.users.find(); 
}

通过这种方式,可以轻松地使用新语言进行扩展