Mongo db条件查询

问题描述:

是mongo的新手,卡在条件查询中: 我想根据3条件,名字,姓氏和电子邮件ID执行搜索: 下面的查询工作完美时,所有的领域存在:Mongo db条件查询

db.students.find({ $and: [ { first_name: /^Abc$/i }, { last_name:   'Xyz'},{email_id:'[email protected]'} ]}) 

的问题是,当我不给一个电子邮件ID,它认为电子邮件ID为空,并搜索相结合“ABC Firtis空”这么想的返回的任何结果查询, 正如我想要满足下面的情景: 我有一个学生的集合:

- FirstName: 1. ABC 2. ABC 3.ABC 
- LastName: 1.XYZ 2. XY 3. XZ 
- EmailID: [email protected] [email protected] [email protected] 

如果在搜索时只输入第一个名字,它应该返回所有3个结果 如果用户输入名字和姓氏,它应该返回前两个结果,如果用户输入所有三个细节,它应该只返回1结果。

任何线索将不胜感激。

+0

在这种情况下,为什么要使用$和operator?只需使用db.students.find({first_name:/^abc $/i,last_name:'Firtis',email_id:'gd @ he'}) ' –

+0

这可以作为一个或者,并且给我所有的3个结果即使我输入所有三个值 –

你似乎在谈论“输入”数据是用于查询不同的要问题,以及如何去构造查询忽略领域作为你没有输入标准。

这是所有关于如何收集输入的信息都是关于如何处理它的,但这一切都归结为你“有条件地构建”了查询(我只是一个数据结构),而不是静态定义一个查询,并以某种方式忽略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的输入。因此,如果您将代码构造为接受类似对象的输入(或者已经拥有它),那么您可以使用它来构建查询。

还要注意的是所有 MongoDB的查询参数是隐式定义的“AND”条件,所以很少需要使用$and,除非你明确地有多个条件,以满足同一文档属性。即使这样,通常会有更好的语法替代。

+0

感谢您的精彩解释..思考相同的轨道.. :) –

没有必要给,你可以简单地尝试这种

发现({FIRST_NAME:{$正则表达式: '/ ^美国广播公司$/I'},姓氏: 'XYZ',EMAIL_ID: '的gd @他' }