MongoDB数据库
关于database的基础命令
- 查看当前的数据库:
db
- 查看所有的数据库:
show dbs/ show databases
- 切换数据库:
use db_name
- 删除当前的数据库:
db.dropDatabase()
关于集合的基础命令
- 手动创建集合:
db.creatCollection(name,options)
db.createCollection("stu")
db.createCollection("stu",{capped:true,size:10})
- capped:上线
size:上限字节数
- 查看集合:
show collections
- db.集合名称.drop()
数据类型
- Object ID:文档ID
- String:字符串
- Boolean:布尔值,true或false
- Integer:整数,32位或64位
- Double:储存浮点值
- Arrays:数组或列表
- Object:用于嵌入式的文档
- Null:储存Null值
- Timestamp:时间戳
- Date:当前日期或者UNIX的时间格式
注意点
- 创建日期语句:YYYY-MM-DD
- new Date('2020-09-08)
- 每个文档都有一个属性,为_id,保证唯一性
保存
db.集合名称.save(document)
_id已存在就修改,不存在则添加
更新
db.集合名称.update(<query>,<update>,{multi:<bollean>})
-
db.test.update({name:"xiaowang"},{name:"xiaozhao"})
把name为xiaowang 的数据替换为{name:"xiaozhao"} -
db.test.update({name:"xiaohong"},{$set:{name:"xiaozhang"}})
把name为xiaohong的数据更新为xiaozhang -
db.test.update({name:"xiaozhao"},{$set:{name:"xiaoming"}}
{multi:true}) 更新多条数据
删除
db.集合名称.remove(<query>,{justOne:<boolean>})
数据查询
- find() 查询
db.collection.find({条件文档})
- findOne() 查询,只返回第一个
db.collection.findOne({条件文档})
- pretty() 格式化
db.collection.find({条件文档}).pretty()
比较运算符
- 等于:默认是等于判断,没有运算符
- 小于:
$lt (less than)
- 小于等于:
$lte (less than equal)
- 大于:
$gt(greater than)
- 大于等于:
$gte
- 不等于:
%ne
范围运算符
$in $nin
db.collection.find({age:{$in[18,20,22]}})
逻辑运算符
- and
-在json中写多个条件即可 - or
- 使用$or
- eg:
db.collection.find({$or[{age:18},{gender:man}]})
投影
db.collection.find({},{_id:0,name:1,age:1})
排序
db.collection.find().sort({age:1})
按照age升序输出
db.collection.find().sort({age:-1})
按照age降序输出
统计个数
db.collection.find({条件}).count()
db.collection.count({条件})
消除重复
db.collection.distinct("hometown")
数据的备份和恢复
恢复
mongorestore -h dbhost -d dbname -o dbdirectory
- -h 服务器地址
- -d 需要恢复的数据库实例
- --dir 备份数据所在位置
备份
mongodump -h dbhost -d dbname -o dbdirectory
聚合
-db.collectionname.aggregate({管道:{表达式}})
常用管道
-
$group:
集合中文档分组 -
$match:
过滤数据,输出符合条件的文档 -
$project:
修改输出文档的结构 -
$sort:
将输入文档排序后输出 -
$limit:
限制聚合管道返回的文档数 -
$skip:
跳过指定数量的文档 -
$unwind:
将数组类型的字段进行拆分
$group 注意点
- ``$group` 对应的字典中有几个键,结果就有几个键
- 分组依据需要放到
_id
后边 - 取不同的字段的值需要使用gender
,
$age` - 取字典嵌套的字典中的值的时候
$_id.country
- 能够同时按照多个键进行分组
{$group:{_id:{country:"$country",province:"$province"}}}
- 结果是:
{_id:{country:"",province:""}}
- 结果是:
表达式
处理输入文档并输出
语法:表达式:'$列名'
常用表达式:
-
$sum:
计算总和 -
$avg:
计算平均值 -
$min:
获取最小值 -
$max:
获取最大值 -
$push:
在结果文档中插入值到一个数组中 -
$first:
根据资源文档的排序获取第一个文档数据 -
$last:
根据资源文档的排序获取最后一个文档数据
分组举例
按照gender进行分组,获取不同数据的个数的平均年龄
db.stu.arrregate( {$group:{_id:"$gender",count:{$sum:1},avg_age:{$avg:"$age"}}}, {$project:{gender:"_id",count:1,avg_age:"$avg_age",_id=0}} )
按照hometown进行分组,获取不同组的平均年龄
db.stu.aggregate( {$group:{_id:"$hometown",mean_age:{$avg:"$age:}}} )
选择年龄大于20的学生,观察男性和女性有多少人
-
db.stu.aggregate( {$match:{age:{$gt:20}}}, {$group:{_id:"$gender",count:{$sum:1}, {$project:{_id:0,gender:"$_id",count:1}} )
分组 db.stu.aggregate( {$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}}, {$group:{_id:{country:"$_id.country",province:"$_id.province"},count:{$sum:1}}} {$project:{country:"$_id.country",province:"$_id.province",count:1,_id:0}}
Group by null
- 将集合所有文档分为一组
- 求所有学生总人数、平均年龄
创建索引
- 插入多条数据
for(i=0;i<1000;i++){db.stu.insert({name:"test"+i,age:i})}
- 查看查询时间
db.collection.find().explain("executionStats")
- 建立索引
-
db.collection.ensureIndex({name:1})
1为升序;-1为降序
-
- 查看索引
db.collection.getIndexes()
- 查看索引
db.collection.dropIndex(索引名称)
- 创建唯一索引
db.collection.ensureIndex({ }),{"unique":true}
爬虫数据去重,实现增量式爬虫
使用数据库建立关键字段(一个或多个)建立索引进行去重
-
根据url地址去重
- 使用场景:
- url地址对应的数据不会变的情况,url地址能够唯一的判别一条数据的情况
- 思路
- url存在redis中
- 拿到url地址,判断url在redis的url的集合中是否存在
- 存在:说明url一经被请求过,不再请求
- 不存在: url地址没有被请求过,请求,把该url存入redis的集合中
- 布隆过滤器
- 使用多个加密算法加密url地址,得到多个值
- 往对应位置把结果设置为1
- 新来一个url地址,一样通过加密算法生成多个值
- 如果对应位置的值全为1,说明这个url地址已经抓过
- 否则么日游抓过,就把对应位置的值设置为1
- 使用场景:
-
根据数据本身进行去重
- 选择特定的字段,使用加密算法(md5,sha1)将字段进行加密生成字符串
- 后续新来一条数据,同样进行加密,如果字符串在redis中存在,说明数据存在,对数据进行更新,否则说明数据不存在,直接插入
-
创建联合索引
db.collection.ensureIndex({name:1,age:1})