Mongo db条件查询

时间:2015-09-28 05:02:20

标签: 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&# 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个结果。

任何线索都会受到高度赞赏。

2 个答案:

答案 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' }