笔记_MongoDB_2:查 改 删

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 要替换的文档
返回:原有的(被替换的)文档内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值