MongoDB 查询文档使用 find() 方法。find() 方法以非结构化的方式来显示所有文档。
find
1
| db.collection.find(query,field)
|
- 功能 : 查找文档
- 参数
- query 查找条件,相当于where子句
- field 查找的域
- 返回值 : 查找到的所有文档
1 2 3 4 5 6 7
| query: 以键值对方式传递参数,如果是空{}表示查找所 有内容
e.g. 查找所有性别为w的文档 db.class0.find({sex:'w'})
field: 以键值对的方式给出要查找(不查找)的域 以域名为键,以0,1为值分别表示不查找和查找
|
- 如果某一个或多个域设置为0 表示这些域不查找,其他域均查找
- 如果某一个或多个域设置为1 表示这些域查找,其他域均不查找
_id
除非设置为0 否则均会查找
- 除
_id
域其他域不能有的设置1有的设置0
1 2
| e.g. 查找结果只有name域 db.class0.find({sex:'w'},{_id:0,name:1})
|
findOne
- 功能 : 查找第一条符合条件的文档
- 参数 : 同find
- 返回值: 返回查找到的文档
1 2
| e.g. 查找集合中性别为女的第一个文档 db.class0.findOne({sex:'w'},{_id:0,name:1})
|
query更多的筛选用法
操作符 : 使用$
符号注明的一个特殊字符串,表达一定的含义,比如 $lt
表示小于
比较操作符
$eq 等于 ==
1 2 3
| e.g. 查找年龄等于18 db.class0.find({age:{$eq:18}},{_id:0}) ==> db.class0.find({age:18},{_id:0})
|
$lt 小于 <
1 2 3
| e.g. 查找年龄小于18的 db.class0.find({age:{$lt:18}},{_id:0}) db.class0.find({name:{$lt:"John"}},{_id:0})
|
在mongodb中字符串可以比较大小
$lte 小于等于 <=
1 2
| e.g. 年龄小于等于18 db.class0.find({age:{$lte:18}},{_id:0})
|
$gt 大于 >
1 2
| e.g. 查找年龄大于16 且 小于19 db.class0.find({age:{$gt:16,$lt:19}},{_id:0})
|
在mongodb中所有的{} [] 中都可以写多个条件。但根据 参数的不同表达的意思不一样
$gte 大于等于 >=
1 2
| e.g. 大于等于19 db.class0.find({age:{$gte:19}},{_id:0})
|
$ne 不等于 !=
1 2
| e.g. 性别不等于‘m’的 db.class0.find({sex:{$ne:'m'}},{_id:0})
|
使用ne查找也会找到该域不存在的文档
$in 包含
1 2
| e.g. 找到年龄为 [10,20,30] db.class0.find({age:{$in:[10,20,30]}},{_id:0})
|
$nin 不包含
1 2
| e.g. 找到年龄不是 17 18 19 的 db.class0.find({age:{$nin:[17,18,19]}},{_id:0})
|
逻辑操作符
$and 逻辑与
- 在 query 如果写多个条件默认即为 and 关系
1 2
| e.g. db.class0.find({age:{$lt:18},sex:'m'},{_id:0})
|
- 逻辑与 $and
1 2
| e.g. 年龄小于18并且 性别为男 db.class0.find({$and:[{age:{$lt:18}},{sex:'m'}]},{_id:0})
|
区别: 第一种不能对相同的域进行操作
$or 逻辑或
1 2
| e.g. 年龄小于16或者年龄大于18 db.class0.find({$or:[{age:{$lte:16}},{age:{$gt:18}}]},{_id:0})
|
$not 逻辑非
1 2 3 4 5 6 7 8
| e.g. 查找年龄不小于18岁的 db.class0.find({age:{$not:{$lt:18}}},{_id:0})
``` > 非运算并不是正常运算取反 > age < 18 不等于 not[age < 18] > 是因为mongo过于灵活,某个域的值的类型不一致
#### *$nor* not (a or b) ===> (not a) and (not b)
|
e.g. 性别不是m且年龄不小于18
db.class0.find({$nor:[{sex:’m’},{age:{$lt:18}}]},{_id:0})
(年龄大于17 并且 为男生) 或者 姓名叫 Abby
db.class0.find({$or:[{age:{$gt:17},sex:’m’},{name:’Abby’}]},{_id:0})
(年龄不大于18 或者为 女性) 并且 姓名 大于Lucy
e.g.
db.class0.find({$or:[{age:{$not:{$gt:18}}},{sex:’w’}],name:{$gt:’Lucy’}},{_id:0})
1 2 3 4 5 6 7
| ### 数组 Array
* 数组是有序的数据集合 * mongo中数组也可以有多重数据元素混合
查找数组中包含某一条件的元素
|
e.g. 只要score数组中包含小于60的元素即可查询过滤
db.class1.find({score:{$lt:60}},{_id:0})
1 2 3 4
| #### $all
查找数组同时包含多项的文档
|
e.g. 查找同时包含49 67的文档
db.class1.find({score:{$all:[49,67]}},{_id:0})
e.g. 查找score中包含两个元素的文档
db.class1.find({score:{$size:2}},{_id:0})
1 2 3
| #### $slice 取数组的部分进行显示,在`field`中声明
|
e.g. 显示数组中前两项
db.class2.find({},{_id:0,score:{$slice:2}})
e.g. 跳过第一项显示后面两项
db.class2.find({},{_id:0,score:{$slice:[1,2]}})
1 2 3 4 5
| ### 其他常用查找操作符
#### $exists 通过某个域是否存在筛选(true表示存在false表示不存在)
|
e.g. : 查找不存在sex域的文档
db.class1.find({sex:{$exists:false}},{_id:0})
e.g. 找出年龄为单数的文档
db.class1.find({age:{$mod:[2,1]}},{_id:0})
e.g. 查找name域值类型为2的文档
db.class1.find({name:{$type:2}},{_id:0})
1 2 3 4 5 6 7
| #### $regex 找出指定正则的文档
### 查找结果的操作函数
#### distinct
|
db.collection.distinct(filed)
e.g. 获取某个域的值,去重
db.class0.distinct(‘age’)
1 2 3
| #### pretty() 功能:格式化显示查询结果
|
e.g.
db.class0.find().pretty()
1 2 3
| #### limit(n) 功能:显示前n条结果
|
e.g. 显示查询结果前三条
db.class0.find({},{_id:0}).limit(3)
1 2 3
| #### skip(n) 功能: 跳过前n条显示后面的查询结构
|
e.g. : 跳过前5条文档,显示后面的查询结果
db.class0.find({},{_id:0}).skip(5)
1 2 3 4 5
| #### count() 功能 : 统计查询结果数量
> 在统计数量时要给出一定query条件
|
e.g. 统计性别为w的文档个数
db.class0.find({sex:’w’},{_id:0}).count()
1 2 3 4 5 6
| #### sort({field: 1/-1}) 功能: 对查找结果排序 参数: 以键值对表示按照哪个field排序 1 表示升序,-1表示降序
|
e.g. 查找结果按照降序排序
db.class0.find({},{_id:0}).sort({age:-1})
e.g. 按照年龄升序排序,年龄相同时按照姓名降序
db.class0.find({},{_id:0}).sort({age:1,name:-1})
e.g.
db.class0.find({},{_id:0}).sort({age:1}).limit(3)
练习:
1. 创建数据 名称 grade
use grade
2. 创建集合 名称 class
3. 集合中插入若干(5-8条即可)文档 文档格式
{name:'zhangsan',age:10,sex:'m',hobby:['a','b']}
年龄范围 6-15
爱好选择:draw sing dance basketball football pingpong computer 每个同学选择2-5项
db.class.insert({name:'zhangsan',age:10,sex:'m',hobby:['draw','sing']})
4. 查找练习
查看班级所有学生信息
find()
查看班级中年龄为8岁的学生信息
find({age:8})
查看班级中年龄大于10岁学生信息
find({age:{$gt:10}})
查看班级中年龄在8-11岁之间的学生信息
find({age:{$gte:8,$lte:11}})
查看班级中年龄10岁且为男生的学生信息
find({age:10,sex:'m'})
查看班级中小于7岁或者大于14岁的学生
find({$or:[{age:{$lt:7}},{age:{$gt:14}}]})
查看班级中年龄为8岁或者11岁的学生
find({age:{$in:[8,11]}})
找到有2项兴趣爱好的学生
find({hobby:{$size:2}})
找到兴趣中 有draw的学生
find({hobby:'draw'})
找到既喜欢画画又喜欢跳舞的学生
find({hobby:{$all:['draw','dance']}})
统计兴趣有4项的学生人数
find({hobby:{$size:4}}).count()
找出本班年龄第二大的学生
find().sort({age:-1}).skip(1).limit(1)
查看本班学生兴趣爱好涵盖哪些方面
db.class.distinct('hobby')
找到年龄最大的三个学生
find().sort({age:-1}).limit(3)
删除所有年龄大于16或者小于7岁的学生除非他的爱好有三项以上
remove({$or:[{age:{$gt:16}},{age:{$lt:7}}],{hobby:{$size:2}}})