我正在创建可以动态过滤数据的应用。 如果我选择" 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的新手
被修改
答案 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
和其他运算符。