Mongodb 使用 - 以集合存储
-
启动
- mongo
-
查看数据库
- show databases;
- show dbs
- 当数据库中有数据的时候才会显示出来
-
查看当前使用的数据库
- db
-
使用数据库
- use 数据库名
-
创建数据库:
- 直接使用use 数据库名
- 没有的数据库直接使用
-
手动创建集合 - 一般直接添加,不去创建
- db.createCollection(name,options)
-
集合中的 _id 为唯一的
-
查看集合
- show collections
-
向数据库中的某个集合中插入数据
- db.集合名.insert({“1”:10})
- 当键
_id
重复的时候使用这个插入会报错
- 当键
- db.集合名.save({})
- 当
_id
重复的时候会修改原来的数据
- 当
- db.集合名.insert({“1”:10})
-
查看集合的内容
- db.集合名.find()
-
更新
- db.集合名称.update(原内容,修改)
- 直接将原来的内容替换成修改的内容,原来的内容就会消失
- db.集合名.update(原内容,{$set(修改内容)})
- 只修改要修改内容中的部分
- update中有一个参数 {multi} - 默认只修改一条
- 要是使用这个参数将其设置成true则更新多条数据 : {multi:true}
- 这个只能配合$set使用
- db.集合名称.update(原内容,修改)
删除
- 删除
- 删除多条 – 默认
db.集合名.removed(删除内容) - 值删除一条,加一个参数
- 在removed()中添加:
{justOne:true}
即可 - remover(删除内容,{justOne:true})
- 在removed()中添加:
- 删除多条 – 默认
- 删除数据库
- use text;
- db.dropDatabase() - 删除text
- db代表的是当前使用的数据库
- 删除集合
- db.集合名.drop()
查询
- 查询
- find()查询 条件文档{age:18} age=18的
- db.集合名.find({条件文档})
- findOne()查询 , 查询,只返回第一个
- db.集合名.findOne({条件文档})
- pretty() , 将结果格式化
- db.集合名.find({条件文档}).pretty()
- 比较运算符
- 等于:默认判断等于,没有运算符:
- 小于:$lt (less than)
- 小于等于:$lte (less than equal)
- 大于:$gt (greater than)
- 大于等于:$gte
- 不等于:$ne
- 举例:
- db.stu.find({age:{$gte:18}}): 大于等于18的
- 取范围:$in
- db.stu.find(age:{$in:[18,28,38]}): age是18,28,38的
- 逻辑运算符
- and:{},{}
- 或:$or{},{}
- find()查询 条件文档{age:18} age=18的
- 正则表达式 (products:为集合名)
- db.products.find({sku:/^abc/}) – abc开头的
- db.products.fin({sku:{ r e g e x : " 789 regex:"789 regex:"789}}) – 789结尾的
- limit()和skip()
- limit(x):选x个
- skip(x): 跳过x个
- 自定义查询语句
- 可以使用js
- db.集合名.find($where:function(){return this.age<=18}) - 返回age<=18的
- 可以使用js
- 返回部分数据 投影
- db.集合名.find({条件},{显示字段:1})
- db.集合名.find(age:{$gt:18},{name:1}) - 显示写1,不显示的写0,默认_id是显示的,要是不想让其显示则要写_id:0
排序 统计去重
- 排序
- db.集合名.sort({排序字段:排序方式})
- 排序方式:1:升序; -1:降序
- db.集合名.sort({排序字段:排序方式})
- 统计个数
- db.集合名.count({输出条件})
- db.集合名.find({输出条件}).count()
- 中的count()中不能写条件
- 去重
- db.集合名.distinct(去重字段,条件)
- 返回列表
- db.集合名.distinct(去重字段,条件)
聚合 aggregate
- 分组 $group
- db.集合名.aggregate(
{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:"分组名"}}
)- _id:分组的依据
- db.集合名.aggregate(
- $project 修改显示的字段名
- db.集合名.aggregate(
{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:"分组名"}},
{KaTeX parse error: Expected '}', got 'EOF' at end of input: …oject:{gender:"_id"}}
)- 将_id显示的时候显示为gender
- db.集合名.aggregate(
- $match
- 用于过滤数据,只输出符合条件的文档
- db.集合名.aggreate(
{KaTeX parse error: Expected '}', got 'EOF' at end of input: match:{age:{gt:20}}}
)- 输出age 大于 20 的数据
- $sort
- 将输入文档排序后输出
- db.集合名.aggreagte({$sort:{age:1}})
- 按照年龄升序
- $limit
- 显示多少条查询数据
- db.集合名.aggreagte({$limit:2})
- 前两个
- $skip
- 跳过几条数据
- db.集合名.aggreagte({$skip:2})
- $unwind
- 将文档中的某一个数组类型字段拆分成多条
- db.集合名.aggreagte({ u n w i n d : " unwind:" unwind:"字段名"})
$group的注意点
$group
对应的字典中有几个键,结果就有几个键,每条包含数组中的一个值- 分组一句需要放在
_id
后面 - 取不同字段的值需要使用
,
‘
,`
,‘gender
,
$age` - 同时按照不同的字段进行分组就可以达到去重的效果
{$group:{_id:{country:"$country",province:"$province"}}}
- 结果:
{_id:{country:"",province:""}}
- 结果:
- 取字典嵌套的字典的值的时候
$_id.country
索引
-
查询时间
- db.集合名.find().explain(‘executionStats’)
- executionTimeMillis 字段代表用时
-
创建索引
- db.集合名.ensureIndex({属性:1})
- 1:升序
- -1:降序
- 创建属性的值为唯一的要添加
- db.集合名.ensureIndex({属性1:1,属性2:1},{“unique”:true})
- 解决数据的去重
- db.集合名.ensureIndex({属性:1})
-
查看索引
- db.集合名.getIndexes()
-
删除索引
- db.集合名.dropIndex(“索引名”)
爬虫数据去重,实现增量式爬虫
-
使用数据库建立关键字段的索引(一个或多个)进行去重
-
根据url地址进行去重
- 使用场景
- url地址对应的数据不会变的情况,url地址能够唯一判别一条数据的情况
- 思路:
- 1.url地址存在redis中
- 2.拿url地址,判断url在redis的url的集合中是否存在
- 2.1存在:说明url已经被请求过,不在请求
- 2.2不存在url没有被请求过,请求,把该url存在redis的集合中
- 布隆过滤器
- 使用多个加密算法加密url地址,得到多个值
- 往对应值的位置把结果设置为1
- 新来的url地址,一样通过加密算法生成多个值
- 如果对应位置的值全为1说明这个url地址已经抓过
- 否则没有抓过,就把对应位置设置为1
- 使用场景
-
根据本身进行去重
- 选择特定的字段,使用加密算法(md5,sha1)将字段进行加密,生成字符串,存入redis集合中
- 后续心里啊一条数据,同样的方法进行加密,如果得到的字符串在redis中存在,说明数据存在,(对数据进行更新),否则数据不存在,直接插入