MongoDB-增删改查操作
本篇介绍一下MongoDB基本的增删改查的操作。首先来看看几个基本的数据库命令:
查看数据库: show dbs
切换数据库: use python21
查看集合:show collections
创建集合:db.createCollection("nor_col")
创建一个有容量限定的集合: db.createCollection("cap_col",{capped:true, size:10})
-设置集合容量大小后,如果插入的数据超过了容量的大小,新的数据会插入,最旧的数据会被删除。比如存放日志信息,几个月前的日志就没有什么价值了,就可以冲掉了。而且日志不能篡改吧。固定大小的集合数据插入之后就不允许修改了。所以有容量限定的集合可以用在日志文档的存储。
下面就看看怎么做增删改查操作:
1、MongoDB插入数据:
命令: db.集合名.insert(document)
单条数据插入:db.nor_col.insert({name:"yang",age:18,class:1,num:1})
多条数据批量插入: db.nor_col.insert([{name:"liu",age:35,class:2,num:3},{name:"liu",age:50,class:2,num:40}])
2、MongoDB 数据保存:
命令:db.集合名称.save(document)
示例: db.stu.save({_id:'20210221',name:wang,gender:2})
先根据 _id去查找,如果查找到了,然后检查_id后面的数据是否相同,相同的话放弃操作,不相同的话,更新操作。如果没有查找到。就插入这条数据。
2、MongoDB查询操作:
命令: db.集合名称.find(查询条件)
查询条件:
比较运算符:
等于:默认是等于判断,没有运算符
小于:$lt (less than)
小于等于: $lte(less than equal)
大于: $gt (greater than)
大于等于: $gte
不等于: $ne
逻辑运算符:
and: 在json中写多个条件即可
示例:查询年龄大于或等于18,并且性别为true的学生
db.stu.find({age:{$gte:18},gender:true})
db.stu.find({$and:[{age:18},{gender:true}]})
or: 使用$or,值为数组,数组中每个元素为json
示例1:查询年龄大于18岁,或性别为false的学生
db.stu.find($or:[{age:{$gte:18},{gender:false}}])
示例2:查询年龄大于18或性别为男生,并且姓名是郭靖
db.stu.find($or:[{age:{$gte:18}},{gender:true}],name:"郭靖")
示例3:显示查询操作的详细信息。
db.stu.find().explain('executionStats')
范围运算符:
使用$in, $nin 判断数据是否在某个数组内
示例1:查询年龄为18,28的学生
db.stu.find({age:{$in:[18,28]}})
示例2:查询年龄不在18,28的学生
db.stu.find({age:{$nin:[18,28]}})
支持正则表达式:
使用$regex编写正则表达式
查询name以'黄'开头的数据
示例: db.stu.find({name:{$regex:'^黄'}})
只查询一条数据:
命令:db.集合名称.findOne()
自定义查询:
mongo shell是一个js的执行环境,使用$where写一个函数,返回满足条件的数据。
示例:查询年龄大于30的学生。
db.stu.find({$where:function(){
return this.age >30;
}})
skip、limit:可以做分页操作:
命令:
db.stu.find().skip(num)
db.stu.find().limit(num)
示例:
db.stu.find().limit(4).skip(5)
db.stu.find().skip(5).limit(4)
投影:在查询到的返回结果中,只选择必要字段
命令:db.集合名称.find({},{字段名称:1,.....})
参数为字段与值,值为1表示显示,值为0不显示,特别注意:
1、对于_id列默认是显示的,如果不显示需要明确设置为0
2、对于其他不显示的字段不能设置为0
示例:
db.stu.find({},{_id:0,name:1,gender:1})
排序:方法sort(),用于对查询结果按照指定的字段进行排序。
命令:db.集合名称.find().sort({字段:1,.....})
参数1为升序排序,参数-1为降序排序。
示例:
根据性别降序,再根据年龄升序。
db.stu.find().sort({gender:-1,age:1})
统计个数:方法count()用于统计结果集中文档条数
命令: db.集合名称.find({条件}).count()
示例:
db.stu.find({gender:true}).count()
db.stu.count({age:{$gt:20},gender:true})
去重:
db.stu.distinct("hometown")
db.stu.distinct("hometown",{age:18})
3、MongoDB的更新操作:
命令:db.集合名称.update({query},{update},multi:boolean)
-参数query:查询条件
-参数update:更新操作符
-参数multi:可选,默认是false,表示只更新找到的第一条数据,值为true表示把满足条件的所有数据全部更新
示例1:根据条件更新整个文档的数据。
原始数据:
{ "_id" : ObjectId("6031a9455050ea1c221bf28d"), "name" : "liu", "age" : 50, "class" : 2, "num" : 40 }
执行命令:
db.nor_col.update({num:40},{name:"liu2"})
更新后的数据:
{ "_id" : ObjectId("6031a9455050ea1c221bf28d"), "name" : "liu2" }
示例2:更新第一条找到匹配条件的数据。
原始数据:
{ "_id" : ObjectId("6031a8bd5050ea1c221bf289"), "name" : "wang", "age" : 45, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8c65050ea1c221bf28a"), "name" : "wang", "age" : 40, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8d15050ea1c221bf28b"), "name" : "wang", "age" : 50, "class" : 2, "num" : 2 }
执行命令:
db.nor_col.update({name:"wang"},{$set:{age:25}})
更新后数据:
{ "_id" : ObjectId("6031a8bd5050ea1c221bf289"), "name" : "wang", "age" : 25, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8c65050ea1c221bf28a"), "name" : "wang", "age" : 40, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8d15050ea1c221bf28b"), "name" : "wang", "age" : 50, "class" : 2, "num" : 2 }
示例3:更新所有匹配条件的数据。
原始数据:
{ "_id" : ObjectId("6031a8bd5050ea1c221bf289"), "name" : "wang", "age" : 25, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8c65050ea1c221bf28a"), "name" : "wang", "age" : 40, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8d15050ea1c221bf28b"), "name" : "wang", "age" : 50, "class" : 2, "num" : 2 }
执行命令:
db.nor_col.update({name:"wang"},{$set:{age:25}},{multi:true})
更新后数据:
{ "_id" : ObjectId("6031a8bd5050ea1c221bf289"), "name" : "wang", "age" : 25, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8c65050ea1c221bf28a"), "name" : "wang", "age" : 25, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8d15050ea1c221bf28b"), "name" : "wang", "age" : 25, "class" : 2, "num" : 2 }
示例4:更新所有数据中age字段的值。
原始数据:
{ "_id" : ObjectId("6031a8bd5050ea1c221bf289"), "name" : "wang", "age" : 25, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8c65050ea1c221bf28a"), "name" : "wang", "age" : 25, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8d15050ea1c221bf28b"), "name" : "wang", "age" : 25, "class" : 2, "num" : 2 }
执行命令:
db.nor_col.update({},{$set:{age:21}},{multi:true})
更新后的数据:
{ "_id" : ObjectId("6031a8bd5050ea1c221bf289"), "name" : "wang", "age" : 21, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8c65050ea1c221bf28a"), "name" : "wang", "age" : 21, "class" : 2, "num" : 2 }
{ "_id" : ObjectId("6031a8d15050ea1c221bf28b"), "name" : "wang", "age" : 21, "class" : 2, "num" : 2 }
示例5:upsert参数,找到匹配的字段就更新,没有找到就插入一条新数据
原始数据:
{ "_id" : "6031a9455050ea1c221bf28d", "python" : "hello mongodb", "age" : 21 }
执行命令:
db.nor_col.update({python:"nihao mongo"},{$set:{age:100}},{upsert:true})
更新后的数据:
{ "_id" : ObjectId("603267c4c7c8ce72d1164470"), "python" : "nihao mongo", "age" : 100 }
4、MongoDB的删除:
命令:db.集合名称.remove({query},{justOne:boolean})
-参数query可选,删除的文档条件。
--参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除全部
示例1:删除所有name=wang的数据
db.nor_col.remove({name:"wang"})
示例2:删除name=wang的第一条数据
db.nor_col.remove({name:"wang"},{justOne:true})
参考: