MongoDB条件查询

MongoDB条件查询,mongodb,mongodb-query,Mongodb,Mongodb Query,作为mongo的新手,陷入条件查询: 我想根据3个条件执行搜索,即名字、姓氏和电子邮件id: 当所有字段都存在时,下面的查询工作正常: db.students.find( { $and: [ { first_name: /^Abc$/i }, { last_name: 'Xyz'},{email_id:'gd@he'} ]}) 问题是,当我不提供电子邮件id时,查询不会返回任何结果,因为它认为电子邮件id为空,并搜索组合“Abc Firtis null”, 我希望实现以下场景

作为mongo的新手,陷入条件查询: 我想根据3个条件执行搜索,即名字、姓氏和电子邮件id: 当所有字段都存在时,下面的查询工作正常:

db.students.find( { $and: [ { first_name:  /^Abc$/i }, { last_name:         'Xyz'},{email_id:'gd@he'} ]})
问题是,当我不提供电子邮件id时,查询不会返回任何结果,因为它认为电子邮件id为空,并搜索组合“Abc Firtis null”, 我希望实现以下场景: 我收集了一些学生:

- 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个结果 如果用户输入名字和姓氏,则应返回前两个结果;如果用户输入所有三个详细信息,则应仅返回一个结果


任何潜在客户都将不胜感激。

无需提供,您只需尝试一下即可


查找({first_name:{$regex:'/^Abc$/i'},last_name:'Xyz',email_id:'gd@he“}

您似乎在谈论“输入”数据对于要发出的查询是不同的,以及如何构造查询以忽略字段作为您没有输入的条件

这实际上是关于如何收集输入以及如何处理输入,但归根结底是“有条件地构建”查询(无论如何,这只是一个数据结构),而不是静态地定义查询并以某种方式忽略
null
或空数据

因此,如果有单独的变量,则测试每个值并构建查询:

var firstName=“abc”,
lastName=“xy,
email=null,
查询={};
如果(名字){
query.firstName=newregexp(“^”+firstName,“i”)
}
如果(姓氏){
query.lastName=newregexp(“^”+lastName,“i”)
}
如果(电子邮件){
query.email=newregexp(“^”+email,“i”)
}
db.students.find(查询)
这将构建一个查询对象,根据输入结果如下:

{“firstName”:/^abc/i,“lastName”:/^xy/i}
因此,由于
电子邮件中没有任何值,因此不包括该条件。最终结果是,甚至不查询未提供的条件,然后获得相关匹配项

如果您有一些结构化的输入,则基本上可以简化相同的方法:

var参数={
firstName=“abc”,
lastName=“xy”
};
var query={};
Object.keys(参数).forEach(函数(键){
如果(参数[键])
查询[键]=新的RegExp(“^”+键,“i”);
});
db.students.find(查询);
这是一样的,但是因为所有参数键都在一个地方,所以可以迭代它们来构建查询,而不是单独测试

通常情况下,您的输入来自web请求,其中的参数根据您的输入方法进入
req.params
或甚至
req.body
。因此,如果您将代码构造为接受输入到类似对象(或已经拥有它)中,那么您可以使用它来构建查询


还要注意,所有的MongoDB查询参数都隐式地是一个“AND”“根据定义设置条件,因此很少需要使用
$和
,除非您明确地为同一文档属性满足多个条件。即使这样,通常也有更好的语法替换。

在这种情况下,为什么要使用$and运算符?只需使用
db.students.find({名字:/^Abc$/i,姓氏:'Firtis',电子邮件id:'gd@he“})
这就像一个or,即使我输入了所有三个值,也会给出所有3个结果感谢精彩的解释..ws在同一轨道上思考..:)