目录
MongoDB安装
Ubuntu安装
sudo apt-get install -y mongodb-org
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
其他安装
服务端启动
客户端启动
增删改查
关于database的基础命令
查看当前数据库:db
查看所有的数据库:show dbs/ show databases
切换数据库:use 数据库的名字
删除当前数据库:db.dropDatabase()
mango中没有创建数据库,不需要提前创建,直接使用use命令
例如下面的test1,但是如果没有立刻向use1中添加数据,再接着show的时候也不会显示test1
关于集合的基础命令
mongodb中的一个表就是一个集合
不手动创建集合:
向不存在的集合中第一次加入数据时,集合就会被创建出来
手动创建集合:
db.creatCollection(name,options)
db.creatCollection("stu")
db.creatCollection("sub",{capped:true,size:10})
参数capped默认值为false表示不设置上限
参数size:当capped为true,需要指定此参数,表示上限大小,当文档达到上限时,会把前面的数据覆盖。单位是字节
查看集合:show collections
删除集合:db.集合名字.drop()
mongodb中的数据类型
objectID:文档ID
string:字符串,最常用,必须是有效的UTF-8
Boolean:存储一个布尔值,true或false
integer:整数,可以是32位或64位,取决于服务器
double:存储浮点值
arrays:数组或列表,多个值存储到一个键
object:用于嵌入式的文档,即一个值为一个文档
null:存储null值
timestamp:时间戳,表示从1970-1-1到现在的总秒数
date:存储当前日期或时间的Unix时间格式
注意点
创建日期语句如下:new Date('2010-01-01')
每个文档都有一个属性,为_id,保证每个文档的唯一性
可以自己去设置_id插入文档;如果没有提供,那么mongodb为每个文档提供可一个独特的id,类型为objectID
objectID是一个12字节的十六进制数:
前4个字节为当前时间戳‘
接下来3个字节的机器ID
接下来的2个字节中mongodb的服务进程id
最后3个字节是简单的增量值’
插入
db.集合名字.insert(document)
db.stu.insert({name:'ac',gender:1})
db.stu.insert({_id:'20170101',name:'ac',gender:1})
插入文档时,如果不指定ID参数,mongDB会为文档分配一个唯一的objectID
保存
db.集合名字.save(document)
如果文档的id已经存在则对集合进行修改;否则就添加集合
简单查询
db.集合名字.find()
更新
db.集合名字.update(<query>,<update>,{multi:<boolean>})
参数query:查询条件
参数update:更新操作符
参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
db.stu.update({name:'hr'},{name:'mc'})更新一条
db.stu.update({name:'hr'},{$set:{name:'mc'}})更新一条
db.stu.update({},{$set:{gender:0},{multi:true}})更新全部
注意:multi update only works with $ operators
删除
db.集合名字。remove(<query>,{juestOne:<boolean>})
参数query:可选,删除的文档的条件
参数justOne:可选,如果设为true或1,则只删除一条,默认是false,删除多条
高级查询
数据查询
db.集合名字.find({条件文档})
db.集合名字.findOne({条件文档})查询,只返回第一个
db.集合名字.find({条件文档}).pretty() 将结果格式化打印出来
比较运算符
等于:默认是等于判断,没有运算符
小于:$lt less than
小于等于:$lte less than equal
大于:$gt greater than
大于等于:$gte
不等于:$ne
范围运算符
使用$in,$nin判断是否在某个范围内
逻辑运算符
and:在json中写多个条件即可
db.stu.find({age:{$gte:18}},{gender:true})
or:使用$or,值为数组,数组中的每个元素为json
db.stu.find({$or:[{age:{$gt:18},{gender:false}}]})
查询年龄大于18或性别为男性,并且姓名是郭靖
db.stu.find({$or:[{age:{$gt:18}},{gender:false}],name:'gj'})
支持正则表达式
使用//或$regex编写正则表达式
db.stu.find({sku:/^abc/})
db.stu.find({sku:{$regex:'789$'}})
limit和skip
db.集合名字.find().limit(number) 用于读取指定数量的文档
db.stu.find().limit(2)
db.集合名字.find().skip(number) 用于跳过指定数量的文档
db.stu.find().skip(2)
同时使用
db.stu.find().limit(2).skip(3)
自定义查询
像之前进行操作的语句都是json,同样也可以对js进行操作。但是在Python的环境下,这部分是不会用到的
使用$where后面写一个函数,返回满足条件的数据
投影
过滤查询的信息
在查询到的返回结果中,只选择必要的字段
db.集合名字.find({},{字段:1,字段:0,,,})
参数为字段与值,值1表示显示,值2表示不显示
对于_id默认是显示,如果不显示需要明确设置为0
排序
方法sort(),对集合进行排序
db.集合名字.find().sort({字段:1,字段:2.。。。})
参数1为升序,-1为降序
根据性别排序,再根据年龄排序
db.stu.find().sort({gender:-1,age:1})
统计个数
方法count()统计文档条数
db.集合名字.find({条件}).count()
db.集合名字.count({条件})
消除重复
方法distinct()对数据进行去重
db.集合名字.distinct(“去重条件”,{条件})
db.stu.distinct('hometown',{age:{$lt:18}})
不会对原数据库中数据做操作
数据的备份与恢复
备份的语法
在系统的终端输入以下命令:
mongodump -h dbhost -d dbname -o dbdirectory
-h:服务器地址,也可以指定端口号
-d:需要备份的数据库名称
-o:备份的数据的存放位置,此目录中存放着备份出来的数据
mongodunp -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
恢复的语法
mongorestore -h dbhost -d dbname --dir dbdirectory
-h:服务器地址
-d:需要恢复的数据库实例(恢复后出现的新数据库)
--dir:备份数据所在位置(备份的老数据库)
mongorestore -h 192.168.196.12827017 -d test2 --dir ~/Desktop/test1bak/test1
聚合命令
聚合aggregate是基于数据处理的聚合管道,每个文档通过一个由多个阶段stage组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果
db.集合名字.aggregate({管道:{表达式]})
常用管道
在mongodb中,文档处理完毕后,通过管道进行下一次处理
$group:将集合中的文档分组,可用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名,增加,删除字段,创建计算结果
$sort:将输入文档排序后输出
$limit:限制聚合管道返回的文档数
$skip:跳过指定数量的文档,并返回余下的文档
$unwind:将数组类型的字段进行拆分
表达式
处理输入文档并输出:
语法: 表达式:'$列名'
常用表达式:
$sum:计算总和,$sum:1表示以一倍计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档数据
$last:根据资源文档的排序获取最后一个文档数据
$group
将集合中的文档分组,可用于统计结果
_id表示分组的依据,使用某个字段的格式为‘$字段’
依据多个条件进行分组
group by null
将集合中所有文档分为一组
$project
修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
多个管道一起使用就要注意管道使用的先后顺序
$match
用于过滤数据,只输出符合条件的文档
match是管道命令,能将结果交给后一个管道,但是find不能作为管道去用
练习
$sort
将输入文档排序后输出
查询学生信息,按年龄升序
db.stu.aggregate({$sort:{age:1}})
$limit和$skip
$limit限制管道返回的文档数
$skip跳过指定数量的文档,并返回余下的文档
注意顺序:先写skip,再写limit
$unwind
将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
db.集合名称.aggregate({$unwind:'$字段名称'})
观察下图通过管道之后的结果,unwind将size字段中为空和null的值直接忽略了。实际情况中,不可以忽略空值,unwind就有以下用法
属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档
false表示丢弃属性值为空的文档
db.集合名字.aggregate(
{$unwind:
{path:'$字段名称',
preserveNullAndEmptyArrays:<boolean>}
})
练习
索引的建立
创建索引
数据准备:插入10万条数据到数据库中
for(i=0;i<100000;i++){db.t255.insert({name:'test'+i,age:i})}
使用find()查询name字段值为test10000,测试本次查询花费的时间
下面,创建索引
db.集合.ensureIndex({属性:1}),1表示升序,-1表示降序
通常下面中numIndexsBefore:1中的1指的是原来_id创建的索引
创建过索引之后,再使用索引进行查询,并获取本次查询的时间:
db.t255.find({name:'test10000'}).explain('executionStats')
可见,索引是为了更快的提升查询速度
查看当前集合的所有索引
db.集合.getIndexes()
删除索引
db.集合.dropIndex('索引名称')
创建唯一索引(索引的值是唯一的)
db.集合.ensureIndexp({'字段名字':1},{‘unique’:true})
使用场景:
爬虫数据去重:
使用数据库建立关键字段(一个或多个)索引进行去重
建立联合索引(什么时候需要联合索引)
db.集合.ensureIndex({字段1:1,字段2:1.。。。})