MongoDB
1.mongodb概述
1.1MongoDB优点
- 易扩展
- 大数据量
- 灵活的数据模型
1.2MongoDB缺点
- 数据重复存储
1.3MongoDB概念
- MongoDB三要素
- 数据库
- 集合(表)
- 文档(记录)
- MongoDB中的数据存储是以Bson的形式存储的,Bson是二进制的json,所以看上去记录的形式类似于json数据
1.4MongoDB中数据类型
- object ID: 文档ID
- String
- Boolean
- Integer
- Double
- Arrays
- Object
- Null
- Timestamp
- Date
2.基本命令
2.1操作数据库命令
-
show dbs/databases查看所有的数据库 -
use db_name切换数据库 -
db查看当前数据库 -
db.dropDatabase()删除当前数据库
2.2操作集合命令
-
db.createCollection(name,iptions)创建集合 -
show collctions查看集合 -
db.collection_name.drop()删除集合
2.3增删改查
- 增
- db.stu.insert({_id:"20190803",name:"lizeyuan",gender:1})
- 插⼊⽂档时, 如果不指定_id参数, MongoDB会为⽂档分配⼀个唯⼀的ObjectId类型的_id
- 保存
-
db.stu.save(document)如果文档_id已经存在则修改,否则添加新的文档 - insert如果文旦存在直接报错
-
- 更新
-
db.集合名称.update({query},{update},{multi:<boolean>})- query: 查询条件
- update: 更新内容,{$set:{update}}加set表示只更新该字段,否则没有更新的字段丢弃
- multi: 为true表示更新全部
-
- 删除
-
db.集合名称.remove({query},{justOne:<boolean>})- query: 查询条件
- justOne: 为true表示删除一条,为false表示删除多条
-
3.高级查询
3.1find()查询
-
db.stu.find({gender:false})查询所有的女生 -
db.stu.findOne({gender:false})查询一个女生 -
db.stu.find({gender:false}).pretty()查询所有的女生并格式化显示
3.2比较运算符
- $lt: 小于
- 如:
db.stu.find({age:{$lt: 18}})查询年龄小于18的学生
- 如:
- $lte: 小于等于
- $gt: 大于
- $gte: 大于等于
- $ne: 不等于
3.3逻辑运算符
- and: 并
- $or: 或
-
db.stu.find({$or:[{age:{$gt:18}}, {gender:false}]})查询年龄大于18,或性别为false的学生
-
- $in: 判断在某个范围
-
db.stu.find({age:{$in:[18,20]}})查询年龄为18或为20的学生
-
- $nin: 判断不在某个范围
3.4正则表达式
- $regex: 编写正则表达式
-
db.stu.find({name:{$regex:"^黄"}})查询姓黄的学生
-
3.5limit和skip
- limit(): 查询指定数量的文档
db.集合名称.find().limit(number)
- skip(): 跳过指定数量的文档
db.集合名称.find().skip(number)
3.6投影(选择性返回查询结果)
- 语法:
db.集合名称.find({query}, {字段名称:1, 字段名称:0})- 1表示显示该字段,0或不写表示不显示
3.7排序sort()
- 语法:
db.集合名称.find({query}).sort({字段1:1, 字段2:-1})- 1表示升序
- -1表示降序
3.8统计个数count()
- 语法
db.集合名称.find({query}).count()db.集合名称.count({条件})
3.9消除重复
- 语法:
db.集合名称.distinct("去重字段",{query}) - 如:
db.stu.distinct("hemotown",{age:{$gt:20}})查询年龄大于20的学生的家乡,去重;返回列表
4.聚合与管道
4.1聚合aggregate()
db.集合名称.aggregate({管道:{表达式})上一个管道的输出结果作为下一个管道的输入
-
常用管道
- $group:将集合中的文档分组,可用于统计结果
- $match:过滤数据,输出符合条件的文档
- $project:修改文档结构,如重命名、增加删除字段、创建计算结果
- $sort:将输入文档排序后输出
- $limit:限制输出文档的个数
- $skip:跳过指定数量的文档,并返回剩下的文档
- $unwind:将数组类型的字段进行拆分
-
常见表达式
- $sum:求和,1表示以一倍计数
- $avg:求平均值
- $min:求最小值
- $max:求最大值
- $push:在结果文档中插入值到一个数组中
- $first:根据资源文档的排序获取第一个文档数据
- $last:根据资源文档的排序获取最后一个文档数据
4.2$group分组管道命令
-
如;
db.stu.aggregate( {$group: { _id:"$gender", counter:{$sum:1} } } )- _id 为分组依据,值为null表示统计整个文档
4.3$match过滤管道命令
-
如:查询年龄大于20的男女学生的人数
db.stu.aggregate( {$match:{age:{$gt:20}} {$group:{_id:"$gender",counter:{$sum:1}}} )- find()虽然也有过滤功能,但不能在管道中使用
4.4$project修改文档输出结构
-
如:查询男女生人生,输出人数
db.stu.aggregate( {$group:{_id:"$gender",counter:{$sum:1}}} {$project:{_id:0,counter:1}} )
4.5$sort排序管道命令
-
如:查询男女人数,按照人数降序
db.stu.aggregate( {$group:{_id:"$gender",counter:{$sum:1}}}, {$sort:{counter:-1}} )
4.6$skip和$limit
-
如:统计男女生人数,按照人数升序,返回第二条数
db.stu.aggregate( {$group:{_id:"$gender",counter:{$sum:1}}}, {$sort:{counter:-1}}, {$skip:1}, {$limit:1} )
5.索引
- 建立索引
db.集合.ensureIndex({属性:1})- 1表示升序
- -1表示降序
- 建立唯一索引
db.集合.ensureIndex({属性:1},{unique:true}) - 建立联合索引
db.集合.ensureIndex({字段1:1,字典2:1}) - 查看当前集合的所有索引
db.集合.getIndexes() - 删除索引
db.集合.dropIndex({索引字段:1})