MongoDB
-
mongodb是非关系型数据库
-
对于关系型数据库,存储数据的时候需要提前建表建库,随着数据的复杂度越来越高,所建的表的数量也越来越多;但是非关系型却不需要
mongodb的基本的命令的使用
1. mongodb的数据库的命令
-
查看当前的数据库:db
-
查看所有的数据库:show dbs/databases
-
切换数据库:use db_name
-
删除当前的数据库:db.dropDatabase()
2. mongodb的集合的命令
-
不手动创建集合:向不存在的集合中第1次加数据时,集合会被创建出来
-
手动的创建集合:
-
db.createCollection(name,options)这给是模型name是要创建的的集合的名字,options是条件
-
db.createCollection("stu")
-
db.createCollection("sub",{capped:true,size:10})
-
capped默认false表示不设置上限,true表示设置上限,size表示上限为10,超过10的部分会覆盖之前的内容
-
-
查看集合:show collections
-
删除集合:db.集合名字.drop()
3. mongodb的增删改查
-
以下的所有的stu是集合的名字
-
增加之插入
- 特点:不设置_id自动匹配
db.stu.insert({name:"张三",age:18})
db.stu.insert({_id:20191919,name:"张三",age:18})
- 成功以后返回:WriteResult({ "nInserted" : 1 })
- 查看结果:db.stu.find()
{ "_id" : ObjectId("5c8b87514e2832ea3f36c903"), "name" : "张三", "age" : 18 }
{ "_id" : 20191919, "name" : "张三", "age" : 18 }
- 增加之保存
- 特点:保存的数据已存在及_id相同,会覆盖之前的数据
db.stu.save({_id:20191919,name:"二狗",age:22})
结果:
{ "_id" : ObjectId("5c8b87514e2832ea3f36c903"), "name" : "张三", "age" : 18 }
{ "_id" : 20191919, "name" : "二狗", "age" : 22 }
- 简单的查询:db.stu.find()
- 更新
db.集合名称.update(<query> ,<update>,{multi: <boolean>})
- query:查询条件,update:更新操作符(就是要改的内容),multi:可选, 默认是false,表示只更新一条,true的时候更新满足条件的所有的内容
db.stu.update({name:'hr'},{name:'mnc'}) 更新一条,覆盖式更新
db.stu.update({name:'hr'},{$set:{name:'hys'}}) 更新一条,只修改更新的那个
db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部,把所有gender的属性的gender的值改为0,无论有没有这个属性,没有的会添加这个属性
-
删除
db.集合名称.remove(<query>,{justOne: <boolean>})
- query:可以写也可不写,不写的话要用{}表示,justOne:默认false表示删除满足条件的所有的内容,改为true或1表示只删除一个
- db.stu.remove({})表示删除集合stu的所有的内容
4. mongodb的查询的多花样
- 4.1 返回的结果不同的查询
- db.stu.find(条件) 简单的返回满足条件的内容
- db.stu.findOne(条件) 简单的返回满足条件的一个内容
- db.stu.find(条件).pretty 简单的返回满足条件的格式化的内容
- 4.2 比较运算符
db.stu.insert([{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true },{"name" : "黄蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false },{"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false },{"name" : "黄药师", "hometown" : "桃花岛", "age" : 40, "gender" : true },{"name" : "段誉", "hometown" : "大理", "age" : 16, "gender" : true },{"name" : "段王爷", "hometown" : "大理", "age" : 45, "gender" : true },{"name" : "洪七公", "hometown" : "华夏", "age" : 18, "gender" : true }])
- 等于: 默认是等于判断, 没有运算符
- $lt:小于 $lt:小于等于 $gt:大于 $gte:大于等于 $ne:不等于
- db.stu.find({age:{$gt:18}}) 大于18岁的人 $gt可以用所有的用算符
- 4.3 逻辑用算符
- and:在json中写多个条件即可: db.stu.find({age:{$gte:18},gender:true})
- or :使用$or,值为数组,数组中每个元素为json:db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
- and和or可以一起用:db.stu.find({$or:[{age:{$gte:18}},{gender:true}],name:'gj'})
- 4.4 范围运算符
- in :使用$in,$nin 判断数据是否在某个数组内:db.stu.find({age:{$in:[18,28,38]}}
- 4.5 正则表达式
- 使用//或$regex写正则表达式
- db.stu.find({name:/^asdas/})
- db.stu.find({name:{$regex:^asdas}})
- 使用//或$regex写正则表达式
- 4.6 skip和limit(可以想成mysql中的limit的两个值,skip表示跳过n个,从第n+1个开始。limit表示取多少个,建议如果两个一起用可以先用skip再用limit)
- skip单独使用:db.stu.find().skip(2)
- limit单独使用:db.stu.find().limit(2)
- 合用:db.stu.find().limit(2).skip(2)
- 4.7 投影:在查询到的返回结果中,只选择必要的字段
- db.集合名称.find({},{字段名称:1,...})
- 参数为字段与值,值为1表示显示,值为0不显 特别注意:对于_id列默认是显示的,如果不显示需要明确设置为0
- db.stu.find({},{_id:0,name:1})
- 4.8 排序:sort()写在db.stu.find()后
_ db.集合名称.find().sort({字段:1,...})
_ 参数1为升序排列 参数-1为降序排列
db.stu.find().sort({gender:-1,age:1})
- 4.9 统计个数:count()
- 条件写在find中:db.stu.find({gender:true}).count()
- 条件写在count中:db.stu.count({gender:true})
- 4.10 消除重复:distinct
- db.集合名称.distinct('去重字段',{条件})
db.stu.distinct('hometown',{age:{$gt:18}}))
- db.集合名称.distinct('去重字段',{条件})
5. mongodb的聚合:
- 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
- db.集合名称.aggregate({管道:{表达式}})
- 5.1 管道
- 5.1.1 管道命令之$group
- 特点:$group是所有聚合命令中用的最多的一个命令,用来将集合中的文档分组
db.stu.aggregate({$group:{_id:"$gender",total:{$sum:1}}})
- 其中注意点:
- db.db_name.aggregate是语法,所有的管道命令都需要写在其中
- _id 表示分组的依据,按照哪个字段进行分组,需要使用$gender表示选择这个字段进行分组
- $sum:1 表示把每条数据作为1进行统计,统计的是该分组下面数据的条数
- 特点:$group是所有聚合命令中用的最多的一个命令,用来将集合中的文档分组
- 5.1.2 group by null
- 特点:当我们需要统计整个文档的时候,$group 的另一种用途就是把整个文档分为一组进行统计
db.stu.aggregate({$group:{_id:null,total:{$sum:1}}})
- _id:null 表示不指定分组的字段,即统计整个文档,此时获取的total表示整个文档的个数
- 特点:当我们需要统计整个文档的时候,$group 的另一种用途就是把整个文档分为一组进行统计
- 5.1.3 透视
- 特点:使用$push后面跟"$name"显示所有的name,如果是"$$ROOT"显示说有的内容
db.stu.aggregate({$group:{_id:null,name:{$push:"$name"}}}) db.stu.aggregate({$group:{_id:null,name:{$push:"$$ROOT"}}})
- 5.1.4 练习
db.tv3.insert([{ "country" : "china", "province" : "sh", "userid" : "a" },{ "country" : "china", "province" : "sh", "userid" : "b" },{ "country" : "china", "province" : "sh", "userid" : "a" },{ "country" : "china", "province" : "sh", "userid" : "c" },{ "country" : "china", "province" : "bj", "userid" : "da" },{ "country" : "china", "province" : "bj", "userid" : "fa" }])
db.tv3.aggregate([ {$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}}, {$group:{_id:{country:"$_id.country",province:"$_id.province"},total:{$sum:1}}} ])
- 5.2 管道之
$match
- 特点:
$match
用于进行数据的过滤,是在能够在聚合操作中使用的命令,和find区别在于$match
操作可以把结果交给下一个管道处理,而find不行
db.stu.aggregate({$match:{age:{$gt:18}}})
年龄大于18岁的人
db.stu.aggregate([{$match:{age:{$gt:18}}},{$group:{_id:"$gender",total:{$sum:1}}}])
年龄大于18的男女的人数
- 特点:
- 5.3 管道之
$project
- 特点:
$project
用于修改文档的输入输出结构,例如重命名,增加,删除字段
db.stu.aggregate({$project:{_id:0,name:1,age:1}})
输出name和age
db.stu.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$project:{_id:0,counter:1}}])
输出各个性别的人数
- 特点:
- 5.4 管道之
$sort
- 特点:
$sort
用于将输入的文档排序后输出
db.stu.aggregate({$sort:{age:1}})
age升序
db.stu.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$sort:{counter:-1}}])
gender分组,counter降序
- 特点:
- 5.5 管道命令之
$skip
和$limit
- 特点:
$limit
限制返回数据的条数;$skip
跳过指定的文档数,并返回剩下的文档数;同时使用时先使用skip在使用limit
db.stu.aggregate([{$skip:2},{$limit:2}])
从第3个开始,返回3,4两个
db.stu.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$sort:{counter:-1}},{$skip:1},{$limit:1}])
gender分组,counter降序,返回第二个
- 特点:
- 5.1.1 管道命令之$group