查找操作
mysql : select * from table where ....
mongodb : db.collection.find(query,field)
find(query,field)
功能 : 查找数据
参数 : query 筛选条件,相当于where子句
field 选择要展示的域
返回值 : 返回查找到的文档
db.collection.find() ---> select * from table
query : 以键值对的形式给出查找条件
e.g. db.class0.find({name:"Lucy"})
field : 以键值对的形式给出要展示(不展示的域)
域名为键,0为值表示不显示该域
1 为值表示显示该域
* 如果使用0设置某些域不显示则默认其他域显示
如果使用1设置某些域显示则默认其他域不显示
* _id 只有设置为0才不显示否则默认显示
* 除_id域,其他域必须同时设置为0或者1
* 如果不写该参数则表示显示所有内容
e.g.
db.class1.find({sex:'m'},{_id:0,name:1,age:1})
findOne(query,field)
功能 : 查找符合条件的第一条文档
参数: 同find
返回值 : 查找到的文档
e.g.
db.class0.findOne({age:17},{_id:0})
query更丰富用法
操作符 : 使用$号注明的一个特殊意义字串,表达某个特 定含义。比如 $gt 表示大于
比较操作符
$eq 等于
e.g. 年龄等于17
db.class0.find({age:{$eq:17}},{_id:0})
$lt 小于 <
e.g.
db.class0.find({name:{$lt:"Tom"}},{_id:0})
* 字符串也可以比较大小
$lte 小于等于 <=
e.g.
db.class0.find({age:{$lte:17}},{_id:0})
$gt 大于 >
db.class0.find({age:{$gt:17}},{_id:0})
$gte 大于等于 >=
db.class0.find({age:{$gte:17}},{_id:0})
$ne 不等于 !=
db.class0.find({age:{$ne:17}},{_id:0})
$in 包含
e.g. 查找年龄在[16 18] 中的
db.class0.find({age:{$in:[16,18]}},{_id:0})
$nin 不包含
e.g. 不是16 17的都找到
db.class0.find({age:{$nin:[16,17]}},{_id:0})
逻辑操作符
$and
* query 中如果多个条件用逗号隔开即为and关系
e.g.
年龄为17 并且为 男
db.class0.find({age:17,sex:'m'},{_id:0})
年龄大于13并且小于18
db.class0.find({age:{$gt:13,$lt:18}},{_id:0})
使用 $and
e.g. 年龄为17 并且为 男
db.class0.find({$and:[{age:17},{sex:'m'}]},{_id:0})
$or 逻辑或
e.g. 年龄大于30或性别为女
db.class1.find({$or:[{age:{$gt:30}},{sex:'w'}]},{_id:0})
$not 逻辑非
年龄不等于17
db.class0.find({age:{$not:{$eq:17}}},{_id:0})
$nor 既不也不
e.g. 查找年龄不等于17,性别不为男的
db.class0.find({$nor:[{age:17},{sex:'m'}]},{_id:0})
条件混合
(年龄大于30 并且叫阿宝) 或者 性别为 w
db.class1.find({$or:[{age:{$gt:30},name:'阿宝'},{sex:'w'}]},{_id:0})
(年龄小于30或者大于33) 并且 性别为 w
db.class1.find({$or:[{age:{$lt:30}},{age:{$gt:33}}],sex:'w'},{_id:0})
数组
表达 : 使用中括号将一定的数据组织成一种数据结构
* 数组中的数据类型可以不同
* 数组是有序的
e.g. 数组值中只要有任意一项大于90即可
db.class2.find({score:{$gt:90}},{_id:0})
$size
通过数组中元素的个数查找
e.g. 查找数组中包含两项的文档
db.class2.find({score:{$size:2}},{_id:0})
$all
查找数组中同时包含多项的文档
e.g. 数组中同时包含88和90
db.class2.find({score:{$all:[88,90]}},{_id:0})
$slice
取数组的部分进行显示,在field中声明
e.g. 显示数组中前两项
db.class2.find({},{_id:0,score:{$slice:2}})
e.g. 跳过第一项显示后面两项
db.class2.find({},{_id:0,score:{$slice:[1,2]}})
其他query查询
$exists
判断一个域是否存在
e.g. 查找有sex域的文档(true表示存在,false表示不存在)
db.class0.find({sex:{$exists:true}},{_id:0})
$mod
余数查找
e.g. 除以2余1的
db.class0.find({age:{$mod:[2,1]}},{_id:0})
$type
数据类型查找
e.g. 查找age值类型是1的
db.class1.find({age:{$type:1}},{_id:0})
操作符用法文档查找
www.mongodb.com ---> docs ---->search
查找结果的进一步操作
distinct()
功能 : 查看集合中某个域的取值范围
e.g. 查看年龄的取值范围
db.class1.distinct('age')
pretty()
功能 : 将查询结果格式化显示
e.g. db.class1.find().pretty()
limit(n)
功能 : 显示查找结果的前n条文档
e.g. 显示查找到的文档的前3条
db.class1.find({},{_id:0}).limit(3)
skip(n)
功能 : 跳过前n条显示后面的内容
e.g. 跳过查找到的前三条,显示后面的内容
db.class1.find({},{_id:0}).skip(3)
count()
功能 : 计数统计
e.g. 统计查找数量
db.class1.find({},{_id:0}).count()
sort({field:1/-1})
功能 : 对查找结果排序
参数 : 以键值对形式给出,键表示按照哪个域排序
1表示升序,-1表示降序
e.g. 对查找结果按照年龄升序排序
db.class1.find({},{_id:0}).sort({age:1})
复合排序: 当第一排序项相同的时候按照第二排序项排序,以此类推
e.g. 当年龄相同时,按照姓名进行排序
db.class0.find({},{_id:0}).sort({age:1,name:1})
函数的连续调用
当一个函数的返回结果仍然是文档集合的时候可以连续调用函数
e.g. 查看年龄最小的三个文档
db.class1.find({},{_id:0}).sort({age:1}).limit(3)
文档的删除操作
mysql : delete from table where ...
mongodb : db.collection.remove(query,justOne)
remove(query,justOne)
功能 : 删除文档
参数 : query 筛选要删除的文档,相当于where
用法同 查找
justOne 布尔值
默认为False 表示删除所有复合条件的文档
如果设置为true 则表示只删除第一条复合条件文档
e.g. 删除年龄域值不是数字类型的
db.class1.remove({age:{$not:{$type:1}}})
e.g. 删除第一个年龄为17的文档
db.class0.remove({age:17},true)
删除一个集合中所有文档
db.collection.remove({})
e.g. 删除class0中所有文档
db.class0.remove({})
练习 :
1. 创建数据库 名字 grade
use grade
2. 数据库中创建集合 名字 class
3. 集合中插入若干文档格式如下
{name:'zhang',age:10,sex:'m',hobby:['a','b'...]}
年龄在4-13之间
hobby几项都可以,可选项: draw sing dance basketball football pingpong running computer
db.class.insert({name:'zhang',age:10,sex:'m',hobby:['a','b'...]})
4. 查询练习
查看班级所人信息
find()
查看年龄大于10岁的学生信息
find({age:{$gt:10}})
查看年龄 8-11 岁之间的学生信息
find({age:{$gt:8,$lt:11}})
找到年龄9岁且为男生的学员
find({age:9,sex:'m'})
找到年龄小于7岁或者大于11岁的学生
find({$or:[{age:{$gt:11}},{age:{$lt:7}}]})
找到年龄8岁或者11岁的学生
find({age:{$in:[8,11]}})
找到有两项兴趣爱好的学生
find({hobby:{$size:2}})
找到喜欢computer的学生
find({hobby:"computer"})
找到既喜欢画画,又喜欢跳舞的学生
find({hobby:{$all:['draw','dance']}})
统计兴趣爱好有3项的学生人数
find({hobby:{$size:3}}).count()
找到本班年龄第二大的学生
find({}).sort({age:-1}).skip(1).limit(1)
查看学生学生兴趣爱好的范围
db.class.distinct('hobby')
找到年龄最小的三个同学
find({}).sort({age:1}).limit(3)
删除虽有年龄小于6岁或者大于12岁的学员
remove({$or:[{age:{$lt:6}},{age:{$gt:12}}]})
修改操作
mysql : update table set ... where ...
mongodb : db.collection.update(query,update,upsert,multi)
功能 : 修改文档
参数 : query 筛选要修改的文档,相当于where
用法同查找
update :将筛选的文档修改为什么内容,相当于 set。 需要配合修改操作符一同使用。
upsert : bool值,默认为false。如果query的文档 不存在则不进行任何操作
如果设置为true则如果query的文档不存在就根据query和update插入新文档
multi : bool值,默认为false。如果query文档有 多条则只修改第一条
如果设置为true 则修改所有符合条件文档
e.g. 将小白年龄改为31
db.class1.update({name:'小白'},{$set:{age:31}})
e.g. 修改文档,如果文档不存在则插入
db.class1.update({name:'阿蓉'},{$set:{age:29}},true)
e.g. 如果有多个年龄小于32的则全部修改
db.class1.update({age:{$lt:32}},{$set:{age:28}},false,true)