MongoDB-查找操作

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

1
findOne(query,field)
  • 功能 : 查找第一条符合条件的文档
  • 参数 : 同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 逻辑与

  1. 在 query 如果写多个条件默认即为 and 关系
1
2
e.g.
db.class0.find({age:{$lt:18},sex:'m'},{_id:0})
  1. 逻辑与 $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})

1
2
3

#### 逻辑条件混合

(年龄大于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})

1
2
3

#### $size
通过数组元素个数查找

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})

1
2
3

#### $mod
余数查找

e.g. 找出年龄为单数的文档
db.class1.find({age:{$mod:[2,1]}},{_id:0})

1
2
#### $type
找出指定数据类型的文档

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)

1
2
3
* 功能: 查看某个域的值范围


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})

1
2

#### 复合排序

e.g. 按照年龄升序排序,年龄相同时按照姓名降序
db.class0.find({},{_id:0}).sort({age:1,name:-1})

1
2
函数的连续调用

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}}})