MongoDB_2 : 查 改 删
query的筛选功能
db.collection.find(query, field)
操作符:使用\$符号注明一个有特殊意义的字符串,用以表达丰富的含义。如$lt,表示‘小于’。
比较操作符:
$eq 等于 =
eg.: db.class0.find({age:17,{_id:0}) # 年龄等于17
$lt 小于 <
eg.: db.class0.find({age:{\$lt:17}},{_id:0}) # 年龄小于17
db.class0.find({name:{$lt:‘Tom’}},{_id:0}) # 姓名小于Tom
$gt 大于
eg.: db.class0.find({age:{$gt:17}},{_id:0}) # 年龄大于17
eg.: db.class0.find({age:{$gt:16,$lt:19}},{_id:0}) # 年龄大于16,小于19
$lte 小于等于
eg.: db.class0.find({age:{$lte:17}},{_id:0}) # 年龄小于等于17
$gte 大于等于
eg.: db.class0.find({age:{$gte:17}},{_id:0}) # 年龄大于等于17
$ne 不等于
eg.: db.class0.find({age:{$ne:17}},{_id:0}) # 年龄不等于等于17
$in 包含
eg.: db.class0.find({age:{$in:[16,18,17]}},{_id:0}) # 查找年龄在数组范围中的文档
$nin 不包含
eg.: db.class0.find({age:{$nin:[16,18,20]}},{_id:0}) # 查找年龄不在数组范围中的文档
逻辑操作符:
表示逻辑‘与’
1.在query文档中,逗号隔开的多个键值对,即表示‘与’关系
eg.: # 年龄17,且性别为男…
db.class0.find({age:17,sex:‘M’},{_id:0})
表示逻辑‘或’ $or
eg.: # 年龄小于17 或者 性别为女
db.class0.find({$or:[{age:{$:17}}, {sex:‘W’}]},{_id:0})
表示逻辑‘非’ $not
eg.: # 年龄不大于17的
db.class0.find({age:{$not:{$gt:17}}},{_id:0})
表示’既不,也不’ $nor
not (A or B) 或 (not A) and (not B)
eg.: # 性别既不为男,年龄也不大于18
db.class0.find({$nor:[{sex:‘M’},{age:{$gt:18}}]},{_id:0})
条件混合:
年龄(大于18或小于17),且性别为女
db.class0.find({$or:[{age:{$gt:18}},{age:{$lt:17}}],sex:‘w’},{_id:0})
年龄大于等于17的男生 或者 姓名为Abby
db.class0.find({$or:[{age:{$gte:17},sex:‘m’}, {name:‘Abby’}]},{_id:0})
数组类型查找
数组:一组数据的有序集合,使用[ ]表示
有序的
数据类型可以不相同
查找数组中包含某一项的文档
eg.: 查找score数组中包含90的文档
db.class3.find({score:90},{_id:0})
{ “name” : “小明”, “score” : [ 78, 85, 90 ] }
{ “name” : “小亮”, “score” : [ 88, 79, 90 ] }
查找数组中同时包含多项的文档
eg: db.class3.find({score:{$all:[88,90]}},{_id:0})
{ “name” : “小亮”, “score” : [ 88, 79, 90 ] }
根据数组项数查找 $size
eg.: 查找score数组中包含三项的文档
db.class3.find({score:{$size:3}},{_id:0})
{ “name” : “小明”, “score” : [ 78, 85, 90 ] }
{ “name” : “小红”, “score” : [ 88, 85, 89 ] }
{ “name” : “小亮”, “score” : [ 88, 79, 90 ] }
选择数组的查询部分 $slice (用于field的第二个参数)
eg.: 显示数组的前两项:
db.class3.find({name:‘小明’},{_id:0,score:{$slice:2}})
{ “name” : “小明”, “score” : [ 78, 85 ] }
eg.: 跳过数组的第1项显示后面的1项
db.class3.find({name:‘小明’},{_id:0,score:{$slice:[1,1]}})
{ “name” : “小明”, “score” : [ 85 ] }
eg.: 跳过数组的第1项显示后面的2项
db.class3.find({name:‘小明’},{_id:0,score:{$slice:[1,2]}})
{ “name” : “小明”, “score” : [ 85, 90 ] }
其他查找操作符
$exist 判断某一个域是否存在
eg.: 查找不存在’sex’域的文档
db.class0.find({sex:{$exists:false}},{_id:0})
{ “name” : “Lily”, “age” : 18 }
eg.: 查找存在‘sex’域的文档
db.class0.find({sex:{$exists:true}},{_id:0})
{ “name” : “Lucy”, “age” : “17”, “sex” : “W” }
{ “name” : “Tom”, “age” : 17, “sex” : “M” }
{ “name” : “Hanna”, “age” : 28, “sex” : “W” }
{ “name” : “Alex”, “age” : 16, “sex” : “w” }
{ “name” : “Hebe”, “age” : 18, “sex” : “w” }
{ “name” : “Selina”, “age” : 26, “sex” : “w” }
$mod 通过除数余数筛选文档
eg.: 筛选年龄除以2,余数为1的
db.class0.find({age:{$mod:[2,1]}},{_id:0})
{ “name” : “Tom”, “age” : 17, “sex” : “M” }
$type 通过数据类型筛选
查找age数据类型为’1’的文档
db.class0.find({age:{$type:1}},{_id:0})
{ “name” : “Lily”, “age” : 18 }
{ “name” : “Tom”, “age” : 17, “sex” : “M” }
{ “name” : “Hanna”, “age” : 28, “sex” : “W” }
{ “name” : “Alex”, “age” : 16, “sex” : “w” }
{ “name” : “Hebe”, “age” : 18, “sex” : “w” }
{ “name” : “Selina”, “age” : 26, “sex” : “w” }
查找name数据类型为’2’的文档
db.class0.find({name:{$type:2}},{_id:0})
{ “name” : “Lily”, “age” : 18 }
{ “name” : “Lucy”, “age” : “17”, “sex” : “W” }
{ “name” : “Tom”, “age” : 17, “sex” : “M” }
{ “name” : “Hanna”, “age” : 28, “sex” : “W” }
{ “name” : “Alex”, “age” : 16, “sex” : “w” }
{ “name” : “Hebe”, “age” : 18, “sex” : “w” }
{ “name” : “Selina”, “age” : 26, “sex” : “w” }
mongo数据类型和数字的对照参看文档
double : 1
string : 2
…
可以通过查看 www.mongodb.com 下的docs文档查找新的操作符使用方法
数据处理函数
distinct(field)
功能:获取集合中某个域的取值返回
eg.: > db.class0.find({},{_id:0})
{ “name” : “Lily”, “age” : 18 }
{ “name” : “Lucy”, “age” : “17”, “sex” : “W” }
{ “name” : “Tom”, “age” : 17, “sex” : “M” }
{ “name” : “Hanna”, “age” : 28, “sex” : “W” }
{ “name” : “Alex”, “age” : 16, “sex” : “w” }
{ “name” : “Hebe”, “age” : 18, “sex” : “w” }
{ “name” : “Selina”, “age” : 26, “sex” : “w” }
#查看class0中age域的取值范围(有哪些值)
db.class0.distinct(‘age’)
[ 18, “17”, 17, 28, 16, 26 ]
pretty( )
功能:将find查找结果格式化显示
eg.: db.class0.find( ).pretty( )
limit(n)
功能:限制显示前n条文档
eg.: > db.class0.find({},{_id:0}).limit(3)
{ “name” : “Lily”, “age” : 18 }
{ “name” : “Lucy”, “age” : “17”, “sex” : “W” }
{ “name” : “Tom”, “age” : 17, “sex” : “M” }
skip(n)
功能:跳过前n条文档,显示后面的文档
eg.: 跳过查找结果的前3条文档,显示后面的内容
db.class0.find({},{_id:0}).skip(3)
count( )
功能:对查找结果计数统计
eg.: 统计年龄大于18的文档有几条 (使用count query参数要写筛选条件)
db.class0.find({age:{$gt:18}},{_id:0}).count( )
2
sort({field:1/-1})
功能:对查找结果按照指定的域排序显示 (1表示升序,-1表示降序)
eg.: 按年龄降序排列
db.class0.find({},{_id:0}).sort({age:-1})
{ “name” : “Hanna”, “age” : 28, “sex” : “W” }
{ “name” : “Selina”, “age” : 26, “sex” : “w” }
{ “name” : “Lily”, “age” : 18 }
{ “name” : “Hebe”, “age” : 18, “sex” : “w” }
{ “name” : “Tom”, “age” : 17, “sex” : “M” }
{ “name” : “Alex”, “age” : 16, “sex” : “w” }
复合排序:对多个域进行排序,当第一排序项相同时,参考第二排序项排序,依次类推。
eg.: 按年龄升序排列,年龄相同时,按姓名升序排序
db.class0.find({},{_id:0}).sort({age:1},{name:1})
{ “name” : “Alex”, “age” : 16, “sex” : “w” }
{ “name” : “Tom”, “age” : 17, “sex” : “M” }
{ “name” : “Lily”, “age” : 18 }
{ “name” : “Hebe”, “age” : 18, “sex” : “w” }
{ “name” : “Selina”, “age” : 26, “sex” : “w” }
{ “name” : “Hanna”, “age” : 28, “sex” : “W” }
函数可以连续调用
(当一个函数的返回结果仍是文档集合,可以继续调用函数处理)
eg.: 查找年龄最大的2位
db.class0.find({},{_id:0}).sort({age:-1}).limit(3)
{ “name” : “Hanna”, “age” : 28, “sex” : “W” }
{ “name” : “Selina”, “age” : 26, “sex” : “w” }
对筛选的文档集合,可以使用索引获取某一项
eg.: 通过序列号1取到删选结果的第二项
db.class0.find({},{_id:0})[2]
{ “name” : “Selina”, “age” : 26, “sex” : “w” }
文档删除操作
mysql: delete from table where …
moingo:
db.collection.deleteOne(query)
功能:删除复合条件的第一条文档
参数:筛选条件,用法同find query
eg.: 删除第一个性别为’M’的文档
db.class1.deleteOne({sex:‘M’})
{ “acknowledged” : true, “deletedCount” : 1 }
db.class1.find({},{_id:0})
{ “name” : “小红”, “age” : 21, “sex” : “w” }
{ “name” : “小张”, “age” : 22, “sex” : “M” }
db.collection.deleteMany(query)
功能:删除所有符合条件的文档
参数:筛选条件,用法同find query
eg.:删除所有性别为’w’的文档
db.class2.deleteMany({sex:‘w’})
{ “acknowledged” : true, “deletedCount” : 2 }
db.class2.find({},{_id:0})
{ “name” : “阿宝”, “age” : “35”, “sex” : “m” }
如果筛选条件为空,则表示删除集合中所有的文档 !!!*
db.collection.remove(query, justOne)
功能:删除文档
参数:query 删除条件,用法同find query
justOne 默认为false,此时remove用法同deleteMany;
如果为true,此时remove用法同deleteOne。
eg.: > db.class0.remove({age:17},true) # 删除1条年龄为17的文档
db.class0.remove({age:17},false) # 删除所有年龄为17的文档
db.collection.findOneAndDelete(query)
功能:查找某个文档并删除
参数:query
返回:显示查找到的文档 (即显示被删除的文档))
eg.: 查找不存在sex域的文档并删除
db.class0.findOneAndDelete({sex:{$exists:false}})
{"_id" : ObjectId(“5bd13bb108b2199bcf4586e6”),“name” : “Lily”,“age” : 18 }
练习:
1.创建数据库grade (use grade)
2.在数据库中创建集合class
3.在集合中插入数据若干(8条左右),格式如下:
{name:xxx,age:10,sex:'m',hobby:['music','..']}
年龄 7~14
hobby: draw dance running sing football basketball computer
.查找练习
查看班级中所有人的信息
db.class.find({},{_id:0})
查看班级中年龄为8岁的人员信息
db.class.find({age:8},{_id:0})
查看年龄大于10岁的学生信息
db.class.find({age:{$gt:10}},{_id:0})
查看年龄在8~12之间的学生
db.class.find({age:{$gt:8,$lt:12}},{_id:0})
查看年龄为9岁且喜欢画画的女生
db.class.find({age:9,hobby:‘draw’},{_id:0})
查看年龄小于8或大于12的学生
db.class.find({$or:[{age:{$lt:8}},{age:{$gt:12}}]},{_id:0})
找到年龄为9或者11的学生
db.class.find({$or:[{age:9},{age:11}]},{_id:0})
找到有两项爱好的同学
db.class.find({hobby:{$size:2}})
找到兴趣爱好中有计算机的同学
db.class.find({hobby:‘computer’})
找到既喜欢画画又喜欢跳舞的同学
db.class.fing({hobby: {$all:[‘draw’,‘dance’]}})
找到有三项爱好的同学有几位
db.class.find({hobby:{$size:3}}).count( )
找到本班年龄第二大的同学
db.class.find({},{_id:0}).sort({age:-1})[1]
查看本班同学爱好都有哪些
db.class.distinct(‘hobby’)
找到年龄最小的三个
db.class.find({},{_id:0}).sort({age:1}).limit(3)
删除所有年龄大于12,或小于8岁的同学
db.class.deleteMany( )
修改文档:
mysql:
update table set...where...
mongo:
db.collection.updateOne(query,update,upsert)
功能:修改第一个符合条件的文档
参数:
query 筛选条件,用法同find
update 要修改的数据项,需要和修改操作符一同使用
upsert bool值,默认为false,表示如果query没有筛选到文档,则不做任何操作
如果设置为true,则如果没有筛选到文档会根据query updata插入新的文档。
eg.: 把第一个年龄为7的人,年龄改为8
db.class.updateOne({age:7},{$set:{age:8}})
如果query内容不存在,则会插入新文档 #upsert:true
db.class.updateOne({name:‘k’},{$set:{age:9}},{upsert:true})
db.collection.updateMany(query,updata,upsert)
功能:修改所有复合条件的文档
参数:同updateOne
eg.: 把所有年龄8的人,改为9
db.class.updateMany({age:8},{$set:{age:9}})’
db.collection.update(query,updata,upsert,multi)
功能:修改复合筛选条件的文档
参数:
query 筛选条件
update 修改内容
upsert 如果设置为true,则如果没有筛选到文档会根据query updata插入新的文档。
multi 默认为false,表示只能修改一条文档(updateOne)
设置为true,表示可以修改多条文档(updateMany)
eg.: 把第一条年龄12的改为13
db.class0.updata({age:12},{$set:{age:13}})
把所有年龄12的改为13
db.class0.updata({age:12},{$set:{age:13}},true)
db.collection.findOneAndUpdate(query,update)
功能:查找一个文档并修改
参数:
query 查找条件
update 修改内容
返回: 修改前的文档内容
eg.: 查找一个文档,把姓名改为’l’
db.class.findOneAndUpdate({name:‘e’},{$set:{name:‘l’}})
db.collection.findOneAndReplace(query,docu)
功能:查找并替换一个文档
参数:
query 筛选出被替换文档的条件
document 要替换的文档
返回:原有的(被替换的)文档内容