如何动态过滤mongodb?

时间:2015-04-23 18:07:24

标签: mongodb

我正在创建可以动态过滤数据的应用。 如果我选择" John"," US",并将性别保留为空白,则不会返回任何结果,因为查询将搜索空白的性别。我无法弄清楚如何在mongodb中动态过滤它。

前:

var fName="John", 
    fCountry="US", 
    fSex="";

    db.users.find({ $and[ {sex: fSex}, {first_name: fName}, {country: fCountry} ]})

该查询将不返回任何内容。

如果我选择" John"," US":

,我希望代码能够返回这样的答案
{"_id": <object>, "first_name": "John", "sex": "Male", "country": "US"}

用户:

{"_id": <object>, "first_name": "John", "sex": "Male", "country": "US"},
{"_id": <object>, "first_name": "Rex", "sex": "Male", "country": "Mexico"},
{"_id": <object>, "first_name": "Jane", "sex": "Female", "country": "Canada"}

提前谢谢!,顺便说一句,我是mongo的新手

被修改

1 个答案:

答案 0 :(得分:4)

您可以构建查询对象,而不是假设它看起来像一个特定的结构。

您可以添加任何您想要的支票。

var fName="John", 
    fCountry="US", 
    fSex="";

var query = { $and: [] };

if (fName !== "") { query.$and.push({name: fName}); }
if (fCountry !== "") { query.$and.push({country: fCountry}); }
if (fSex !== "") { query.$and.push({sex: fSex}); }

db.users.find(query);

更新

根据@分号的评论,$and这里是不必要的,因为mongo,by default,将“和”不同的字段组合在一起。一个更简单的解决方案是:

var query = {};
...
query.name = fName; // et cetera.

我将补充说,在构建更详细的查询时,可能需要使用密钥$and和其他运算符。