成为mongo的新手,陷入条件查询: 我想根据3个条件,名字,姓氏和电子邮件ID执行搜索: 当所有字段都存在时,下面的查询工作正常:
db.students.find( { $and: [ { first_name: /^Abc$/i }, { last_name: 'Xyz'},{email_id:'gd@he'} ]})
问题是当我没有给出电子邮件ID时,查询选择返回任何结果,因为它认为电子邮件ID为空并搜索组合' Abc Firtis null&# 39 ;, 我希望在哪里完成以下方案: 我有一群学生:
- FirstName: 1. ABC 2. ABC 3.ABC
- LastName: 1.XYZ 2. XY 3. XZ
- EmailID: 1.abc@xyz 2.Ab@xy 3.Ab@xz
如果只在搜索中输入第一个名字,它应该返回所有3个结果 如果用户输入名字和姓氏,它应该返回前两个结果,如果用户输入所有三个细节,它应该只返回1个结果。
任何线索都会受到高度赞赏。
答案 0 :(得分:4)
你似乎在谈论"输入"您要发出的查询的数据不同,以及如何构建查询以忽略字段作为您没有输入的条件。
这完全取决于如何收集关于如何处理它的输入,但这一切都归结为你有条件地建立"查询(无论如何只是一个数据结构)而不是静态定义查询,并以某种方式忽略null
或空数据。
因此,如果你有单独的变量,那么你测试每个值并构建查询:
var firstName = "abc",
lastName = "xy,
email = null,
query = {};
if (firstName) {
query.firstName = new RegExp("^"+firstName,"i")
}
if (lastName) {
query.lastName = new RegExp("^"+lastName,"i")
}
if (email) {
query.email = new RegExp("^"+email,"i")
}
db.students.find(query)
这将构建一个查询对象,它将根据输入结束:
{ "firstName": /^abc/i, "lastName": /^xy/i }
因为email
中没有值,所以不包括条件。最终结果是没有提供的条件甚至没有查询,然后你得到相关的匹配。
如果您有一些结构化输入,则基本上简化了相同的方法:
var params = {
firstName = "abc",
lastName = "xy"
};
var query = {};
Object.keys(params).forEach(function(key) {
if (params[key])
query[key] = new RegExp("^"+key,"i");
});
db.students.find(query);
它也是一样的,但由于你在一个地方都有所有的参数键,你可以迭代它们来构建查询而不是单独测试。
通常情况下,您可以根据输入方法输入来自req.params
甚至req.body
参数的Web请求。因此,如果您构建代码以接受类似对象的输入(或已经拥有它),那么您可以使用它来构建查询。
另请注意,所有 MongoDB查询参数隐式为" AND"根据定义条件,因此很少需要使用$and
,除非您明确有多个条件来满足相同的文档属性。即使这样,通常也会有更好的语法替代。
答案 1 :(得分:0)
无需提供,您只需尝试此
即可find({first_name:{$ regex:' / ^ Abc $ / i'},last_name:' Xyz',email_id:' gd @ he' }