在上一节中,我们讲了mongoDB增删改的使用,链接为 mongoDB 详解 三、mongoDB 的增删改 ,这一节我们将讲解mongoDB查的使用方法。
一、find()的简单使用
1、查询全部:mongoDB中通常使用find来查询,返回的结果是一个集合中所有的文档,比如我想获取student集合中的所有文档:
eg:
db.student.find()
{ "_id" : ObjectId("5970b888c3305da581a766bf"), "name" : "happyhappy1" }
{ "_id" : ObjectId("5974042a38d873046166fd21"), "name" : "happyPython" }
2、加入限定条件:
2.1、单一限定条件:
可以在find()中第一个参数中加入限定条件,比如,我要在student集合中查询name为happypython的文档:
>db.student.find({"name":"happypython"})
{ "_id" : ObjectId("5974042a38d873046166fd21"), "name" : "happyPython" }
2.2、多限定条件:
可以在find()中加入多个key-value来作为多重限定条件,相当于 sql 中的
key1=value1 AND key2=value2
比如,我要查找 name为zhangsan,sex为1的文档:
>db.student.find({"name":"zhangsan", "sex":1})
{ "_id" : ObjectId("5975fd0b7f9a132c406a1c96"), "name" : "zhangsan", "sex" : 1, "age" : 18 }
3、指定返回的键值数据
比如在上述查询中,我只想返回name数据,不想要 sex 等其他数据。可以在第二个参数中加入返回的key-value,哪个值为1,则返回此键值,为0则不返回,eg:
db.student.find({"name":"zhangsan"}, {"name":1})
其中第一个为查询限定条件,第二个即为返回的key-value
> db.student.find({"name":"zhangsan"}, {"name":1})
{ "_id" : ObjectId("5975fd067f9a132c406a1c95"), "name" : "zhangsan" }
{ "_id" : ObjectId("5975fd0b7f9a132c406a1c96"), "name" : "zhangsan" }
{ "_id" : ObjectId("5975fd0e7f9a132c406a1c97"), "name" : "zhangsan" }
注意其会默认返回 "_id"
隐藏默认返回的_id:
> db.student.find({"name":"zhangsan"}, {"_id":0,"name":1})
{ "name" : "zhangsan" }
{ "name" : "zhangsan" }
{ "name" : "zhangsan" }
隐藏某键,比如要想只隐藏sex,可以这样:
db.student.find({"name":"zhangsan"}, {"sex":0})
二、find()查询条件
find()方法中可以使用各种比较查询条件。
1、比较运算符:
类似于sql中的 > >= < <= 这些比较运算符,mongoDB也有类似的比较运算符,其对应的为 $gt $gte $lt $lte。
比如,我想查询student集合中 age 大于18的,可以这样查询:
db.student.find({"age":{"$gt":18}})
如果想查询 age 大于18,并且小于30的,可以这样查询:
db.student.find({"age":{"$gt":18, "$lt":30}})
其中的不等于运算符 != 在mongoDB中为 $ne ,比如我想查询student集合中 name 不为 happyPython 的数据
db.student.find({"name":{"$ne":"happyPython"}})
2、$or 查询:
我们上述查询基本都是使用 sql 中的 AND 进行查询,即是且的关系,在mongoDB中,OR 的关系可以使用 $or 来表示或的关系。 $or 接受一个集合来作为自己的或查询,其中集合即为各个查询条件。
比如我想找student集合中name为 happyPython 或者 name为 zhangsan 的,可以这样:
db.student.find({"$or":[{"name":"happyPython"}, {"name": "zhangsan"}]})
比如查询student集合中 name 为 zhangsan 或者 sex 为1 ,可以这样:
db.student.find({"$or":[{"name":"zhangsan"},{"sex":1}]})
3、$in 与 $nin 查询:
可以使用 $in 来查询key在一个数组中的值:
比如在student集合中查询age是18或者是19的文档:
db.student.find({"age":{"$in":[18,19]}})
可以使用 $nin 来查询key不在一个数组中的值
得到student集合中age不为18的文档:
db.student.find({"age":{"$nin":[18]}})
注意,此会查询出 age 不为18的文档,注意没有age这个key的文档也会查询出来。
4、 $not 查询:
$not 是元条件语句,可以用在任何其他条件之上,以为条件取反,不符合对应条件的将被返回,比如,判断 age 不为18,20的,可以这样:
db.student.find({"age":{"$not":{"$in":[18,20]}}})
5、null值与空key的判断:
我们知道,在mongoDB中,一个文档中的某个key可以为null,或者没有某个key,比如我要查询某个key值为null的,可以这样:
>db.student.find({"age":null})
{ "_id" : ObjectId("5970b513c3305da581a766bc"), "name" : "happyhappy" }
{ "_id" : ObjectId("5979e768e1e93556c85bc47b"), "name" : "happyPython", "age" : null }
其会返回age值为null或者没有age这个key的文档
但是如果想判断某个key只为null的文档:
db.student.find({"age":{"$in":[null], "$exists":true}})
6、正则表达式查询:
mongoDB中可以使用正则表达式匹配查询,注意 查询的字符串中不带 ""
而且要被 / /i 所包裹,标注这个一个正则匹配:
比如查询name中以happy开头的文档
db.student.find({"name":/^happy/i})
三、find()数组查询:
1、查询数组中带有某个元素的文档:
比如在:
{ "_id" : ObjectId("5970b513c3305da581a766bc"), "name" : "happyhappy", "comments" : [ "well", "good" ] }
想查询comments数组中带有"well"元素的文档。
直接在find()限定条件中加上 数组key 及 想查询的元素,即
db.student.find({"comments":"well"})
2、多元素查询:
使用 $all 进行查询
比如我想查询comments中既有well也有good的文档:
db.student.find({"comments":{"$all":["well","good"]}})
四、查询结果及查询选项:
1、限定返回结果,比如限制1条
db.student.find({"name":"zhangsan"}).limit(1)
2、跳过n条
比如
db.student.find({"name":"zhangsan"}).skip(1)
skip可以和limit联合使用,使用没有前后顺序,意思都为先跳转前skip条然后限制limit条
db.student.find({"name":"zhangsan"}).skip(1).limit(1)
3、排序:
sort ,类似于SQL中的order by
比如我要根据sex进行age进行排序
db.student.find({"name":"zhangsan"}).sort({"age":1})
其中,1代表升序,-1代表降序
如果是多条件排序的话,首先先根据前面的条件进行排序,当前面的排序完成后,在在相同条件的文档中进行后面的条件排序,比 如,我想先根据score进行倒叙,其中同年龄的根据age进行升序
db.student.find({"name":"zhangsan"}).sort({"score":-1,"age":1})