MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB 应用提供可扩展的高性能数据存储解决方案。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
Mongodb适合大数据量的信息,丢失率相对就高,就存储一些相对于不太重要的信息,例如:微博的评论,淘宝的评论,网站流量的统计。
MongoDB常见类型 | 说明 |
Object ID | 文档ID |
String | 字符串,最常用,必须是有效的UTF-8 |
Boolean | 存储一个布尔值,true或false |
Integer | 整数可以是32位或64位,这取决于服务器 |
Double | 存储浮点值 |
Arrays | 数组(js)或列表(python),多个值存储到一个键 |
Object | 用于嵌入式的文档,即一个值为一个文档 |
Null | 存储Null值 |
Timestamp | 时间戳 |
Date | 存储当前日期或时间的UNIX时间格式 |
2.数据库操作
命令 | 操作 |
show dbs | 显示数据库列表 |
db | 显示当前数据库 |
use 数据库名 | 切换或创建数据(有则切换,无则创建) |
db.dropDatabase() | 删除当前所在数据库(D大写) |
使用"show dbs"时,不显示空的数据库
删除数据库前要切换到要删除的数据库,删除之后数据库内内容被清空,使用"show dbs"不显示,但是使用"db"命令的时候还会看到。
3.集合操作
关系型数据库中,每个库是由多张table组成,而NoSQL中,每个库是由多个集合(collection)组成,相当于sql中的table,集合中以键值对的形式保存数据。
命令 | 操作 |
db.createCollection(集合名, [参数]) | 创建集合(一般不用这种方式而 是在插入数据时自动创建) |
show collections/show tables | 查看集合 |
db.集合名.drop() | 删除集合 |
4.数据操作(文档操作)
4.1增
db.集合名.insert({"键名1":值1, "键名2": 值2 ...})
一条insert语句只能插入一行数据,insert后面不能跟多行数据。
4.2删
db.集合名.remove({查询条件})
db.集合名.remove({}) # 删除全部数据
db.集合名.remove({‘title’:’yes’}) 可删除,但是不会真正释放空间,需要继续执行db.repairDatabase()来回收磁盘空间
db.集合名.deleteMany({…}). 删除集合下的满足…的文档
4.3改
db.集合名.update({查询条件}, {修改后结果})
这里要注意,修改后结果就是整行的最终结果,并且只会修改一行,而不是所有匹配结果都修改。
db.集合名.update({查找条件}, {$set:{"要修改的字段名1":修改后的值, "要修改的字段名2": "值2"}})
4.4查
db.集合名.findOne() # 查询一行
db.集合名.find() # 查询全部
db.集合名.find().pretty() # 格式化打印
db.集合名.find({查找条件}) # 按条件查找
查询结果:
"_id"是mongoDB自动添加的主键。十六进制,每两个字符为一个字节,共12个字节,前4个字节为当前时间戳,接下来3个字节为机ID,再接下来2个是MongoDB的进程ID,最后是排序流水号。
4.5高级查询
4.5.1条件操作符
$gt 大于
$lt 小于
$gte 大于等于
$lte 小于等于
$ne 不等于
db.集合名.find({"键名": {比较运算符1:值1, 比较运算符2:值2} })
db.集合名.find({likes:{$gte:100}}). 查找likes大于等于100的数据
db.集合名.find({likes:{$gte:100,$lt:200}}) 查找likes大于等于100且小于200的数据
4.5.2关键字
in/not in
db.集合名.find({"键名": {$in:[值1, 值2, 值3 ...]} })
db.集合名.find({"键名": {$nin:[值1, 值2, 值3 ...]} })
size
db.集合名.find({"键名": {$size:n} })
对于值为list的字段,可以对list的长度(即list当中值的个数)进行判断来查询。
exists
db.集合名.find({"键名": {$exist: true|fase} }) # t、f要小写
查询 包含/不包含 某个字段的数据
or
db.集合名.find({$or:[{条件1}, {条件2}, {条件3}...]})
4.5.3模糊查询
db.集合名.find({"键名": js正则表达)
db.集合名.find({"name":/du/})# 查询name以du开头的数据
4.5.4查询结果排序
db.集合名.find().sort({"键名": 1|-1, "键名": 1|-1...})
1 为升序 -1 为降序
4.5.5限定返回结果数量
db.集合名.find().limit(n)
db.集合名.find().skip(n) # 跳过n条,返回从n+1k开始的数据
db.集合名.find().skip(n).limit(m) # 跳过n条,返回后面的m条
4.5.6查询返回结果数量
db.集合名.find().count()
db.集合名.find().skip(n).count(true) #与skip结合使用时,要加true
4.5.7聚合函数aggregate()
db.集合名.aggregate([ { 管道1: {表达式1} }, { 管道1: {表达式1} }, { 管道1: {表达式1} }, ... ]) # 如果只有一个管道则去掉"[]"
在aggregate()函数中,数据会依次通过每个管道进行筛选过滤,因此称其为管道。
管道 | 说明 |
$group | 将集合中的文档分组,可用于统计结果 |
$match | 过滤数据,只输出符合条件的文档 |
$project | 修改输入文档的结构,如重命名、增加、删除字段、创建 计算结果 |
$sort | 将输入文档排序后输出 |
$limit | 限制聚合管道返回的文档数 |
$skip | 跳过指定数量的文档,并返回余下的文档 |
$unwind | 将数组类型的字段进行拆分 |
只能在$group管道中使用。
分组函数 | 说明 |
$sum | 计算总和,$sum:1同count表示计数 |
$avg | 计算平均值 |
$min | 获取最小值 |
$max | 获取最大值 |
$push | 在结果文档中插入值到一个数组中,相当于拼接字段 |
$first | 根据资源文档的排序获取第一个文档数据 |
$last | 根据资源文档的排序获取最后一个文档数据 |
案例:
# 统计男女生人数
db.集合名.aggregate( {$group: { _id:'$sex', count_sex:{$sum:1} } } );
返回:{ "_id" : "女", "count_sex" : 4 } { "_id" : "男", "count_sex" : 11 }
# 统计所有人平均年龄
db.集合名.aggregate( {$group: { _id:null, 总人数:{$sum:1}, avg_age:{$avg:"$age"}, min_age:{$min:"$age"}, max_age:{$max:"$age"} } } );
返回:{ "_id" : null, "总人数" : 15, "avg_age" : 42.666666666666664, "min_age" : 29, "max_age" : 55 }
5.创建索引
db.集合名.createIndex({“title”:1,”likes”:-1}) 1为升序索引,-1为降序索引
db.集合名.getIndexes(). 查看索引
db.集合名.totalIndexSize(). 查看索引大小
db.集合名.dropIndexes() 删除所有索引
db.集合名.dropIndex(“索引名称”) 删除指定索引