NoSQL学习笔记(五)查询,查询器


查询

查询是任何数据库脚本中最重要的部分,包括:

  1. 简单条件查询
  2. 复杂查询
  3. 聚合查询
  4. 与JS或Mapreduce查询

以上所有查询一定会用到查询器(Query Operator)

简单条件查询

以以下数据为例:

[
    {
        stuname:"jim",
        age:25,
        email:"234234@qq.com",
        java:89,
        hadoop:96,
        hive:87,
        city:"jinan",
        books:["JS","C++","EXTJS","MONGODB"]
    },
    {
        stuname:"tom",
        age:25,
        email:"23423234@qq.com",
        java:79,
        hadoop:66,
        hive:97,
        city:"jinan",
        books:["JAVA","ORACLE","C#","MONGODB"]
    },
    {
        stuname:"lili",
        age:27,
        email:"11234234@qq.com",
        java:80,
        hadoop:76,
        hive:77,
        city:"Qingdao",
        books:["HIVE","HTML","EXTJS","WEB"]
    },
    {
        stuname:"zzxb",
        age:29,
        email:"23121234@qq.com",
        java:59,
        hadoop:66,
        hive:87,
        city:"Qingdao",
        books:["JS","C#","EXTJS","MONGODB"]
    },
    {
        stuname:"xm",
        age:35,
        email:"323234234@qq.com",
        java:84,
        hadoop:86,
        hive:82,
        city:"jinan",
        books:["mysql","C++","html","MONGODB"]
    },
    {
        stuname:"zx",
        age:40,
        email:"234234@qq.com",
        java:49,
        hadoop:56,
        hive:97,
        city:"yantai",
        books:["web","java","hadoop","html"]
    },
    {
        stuname:"zm",
        age:35,
        email:"1144234234@qq.com",
        java:80,
        hadoop:76,
        hive:83,
        city:"yantai",
        books:["wx","java","EXTJS","MONGODB"]
    },
    {
        stuname:"zz",
        age:25,
        email:"234234@qq.com",
        java:79,
        hadoop:96,
        city:"yantai",
        books:["oracle","objective-c","android","html"]
    },
    {
        stuname:"fr",
        age:25,
        email:"23488234@qq.com",
        java:89,
        hadoop:96,
        hive:87,
        city:"jinan",
        books:["mysql","android","EXTJS","MONGODB"]
    },
    {
        stuname:"zlh",
        age:45,
        email:"29934234@qq.com",
        java:84,
        hadoop:66,
        hive:89,
        city:"jinan",
        books:["oracle","objective-c","EXTJS","MONGODB"]
    }
]

使用find查询

find语法:

db.collection.find(query, projection)
//query:查询条件
//projection:附加条件

使用find查询全部字段:

db.students.find();

使用find查询全部字段,并显示除id以外的全部字段

db.students.find(
    {},
    {
        _id:0,
        stuname:1,
        age:1,
        java:1
    }

)

注:_id字段默认为1,即显示; 若让其不显示,必须显式指定其字段为0.

带条件查询:查询city在济南的全部学生的姓名、年龄、所在城市

db.students.find(
    {
        city:'济南'
    },
    {
        _id:0,
        stuname:1,
        age:1,
        city:1
    }
)

查询器

查询器含义对应
$gt大于
$lt小于小于
$gte大于等于
$lte小于等于
$eq等于==
$ne不等于!=

例:查询java成绩大于70分的学生(使用查询器$gt

db.students.find(
    {
        java:{
            $gt:70
        
        }
    },
    {
        _id:0,
        stuname:1,
        age:1,
        java:1
    }
)

例:查询hadoop成绩大于等于66分的学生信息

db.students.find(
    {
        hadoop:{
            $gte:66        
        }
    }
)

查询器总结:

  • 查询器和修改器都是以$开头
  • 查询器与修改器语法格式有区别
//查询器格式
字段:{
    $查询器:值
}
//修改器格式
$修改器:{
    字段:值

}## 标题文字 ##

and查询

and是隐式语法,不用注明关键字
eg:查询hadoop成绩大于等于66分,且所在地在济南的学生信息

db.students.find(
    {
        hadoop:{
            $gte:66
        },
        city:'jinan'
    }
)

eg:查询年龄大于等于25岁,且小于28岁的学生信息

//-------------正确写法-------------//
db.students.find(
    {
        age:{
            $gte:25,
            $lt:28
        }
    }
)


//-------------错误写法-------------//
db.students.find(
    {
        age:{
            $gte:25
        },
        age:{
            $lt:28
        }
    }
)

注:★比较符对同一个字段的时候,一定不要写成两个age,因为机制是后覆盖前,会导致查询结果错误。

eg:查询所在地不在济南的学生的信息

db.students.find(
    {
         city:{
            $ne:'jinan'
        }
    }
)

or语法查询

or是显式语法,需要声明$or
语法格式:

{$or:[ {<expression 1}, <expression 2}, ...,<expression n} ]}

eg:查询hadoop分数大于70分的学生或城市是青岛的学生

db.students.find(
    {
        $or:[
            {
                hadoop:{$gt:70}
            },
            {
                city:'Qingdao'
            }        
        ]    
    }
)

in/nin语法查询

针对同一离散值字段的or查询
eg:查询所有济南或烟台的学生信息

db.stduents.find(
    {
        city:{
            $in:[
                'jinan',
                'yantai'
            ]
        }
    }
)

eg:查询所有不在青岛或或烟台的学生信息

dn.students.find(
    {
        city:{
            $nin:[
                'jinan',
                'yantai'
            ]
        }
    }
)

exists

用于判断某字段是否存在
eg:查询素有sex为空的学生信息

  1. 直接用null搜索

    db.students.find(
     {
         sex:null
     }
    )
  2. 用in搜索

    db.students.find(
     {
         sex:{
             $in:[null]
         }
     }
    )
  3. $exists

    db.students2.find(
     {
         sex : {
             $exists:false
         }
     }
    )

    true表示字段存在,false表示不存在字段信息

type

按照数据类型查询数据
eg:查询sex字段为字符串类型的数据的信息(字符串类型的$type值是10)

db.students.find(
    {
        sex:{
            $type:2
        }
    }
)

type对应的数值类型:

类型数字
Double1
String2
Array4
Boolean8
Date9
Null10
Regular Expression11

not

$not就是逻辑非。但是在与查询器连用时,需要注意“非”的含义,非常容易搞混。
对于下面的语句:

db.inventory.find( { price: { $not: { $gt: 1.99 } } } )

我们知道gt的意思是大于,很容易想到上面的语句是“小于等于1.99”
但是这个理解是错的!!

$gt:1.99的真正含义是:某字段存在且大于1.99,有“存在”和“大于”两个限制条件

所以上面语句的真正意思包括两条:

  • 该字段的值小于等于1.99,或:
  • 该字段不存在。

nor

nor对包含一个或多个查询表达式的数组执行逻辑运算,选择数组中所有查询表达式都不符合的文档。
语法如下:

db.inventory.find( { $nor: [ { price: 1.99 }, { sale: true } ]  } )

例:

db.inventory.find( { $nor: [ { price: 1.99 }, { qty: { $lt: 20 } }, { sale: true } ] } )

该查询包括以下文档:

  • price不等于1.99,且sale值不等于true,或:
  • price不等于1.99,且不包含sale字段,或:
  • 不包含price,且sale字段为false
  • 不包含price,且不包含sale字段

声明:奋斗小刘|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - NoSQL学习笔记(五)查询,查询器


Make Everyday Count