启动mongodb
- sudo mongod –config /etc/mongod.conf & 启动服务端
- mongo 启动客户端
mongodb的增删改查
增
db.collection_name.insert({"_id":"111"})
_id
如果已经存在,insert方法会报错,不存在的时候,会插入新数据db.collection_name.save({"_id":"111","name":"bob","age":"18"})
_id
如果存在,会更ddvd cx x新其他键对应的值(name,age),不存在的时候,会新插入数据
删
db.collection_name.remove({条件},{justOne:true})
- 默认情况下,会删除全部满足条件的内容,justOne:true时值删一条
db.collections_name.drop()
- 删除整个集合(collections_name)
改
db.collections_name.update({name:"bon"},{name:"fan"})
- 更新 将名字为”bon”改为”fan” 弊端:会将collections_name内容代替如:
db.text01.find()
{ "_id" : "3", "name" : "fan", "age" : "16" }
db.text01.update({name:"fan"},{name:"xlnx"})
{ "_id" : "3", "name" : "xlnx" }
db.collections_name.update({nmae:"bob"},{$set:{name:"fan"}})
- 只能修改一条数据,并不会代替,将bob修改为fan
db.collection_name.update({条件},{$set:{name:jack}},{multi:true})
- 默认情况下会修改一条,
multi:true
时可以修改满足条件的全部数据 - 注意:
multi update only works with $ operators
multi:true 只能跟$set连用
查
db.collection_name.find({"age":16})
查询年龄为16db.collections_name.findOne()
查询只返回第一个db.collections_name.find().pretty()
将查询结果格式化
数据库的备份与回复
- 数据库的备份
mongodump -h hostname -d db -o path
- 数据库的恢复
mongorestore -h hostname -d db -dri path
比较运算符
- 等于 默认就是等于判断,没有运算符
- 大于 $gt
db.collection_name.find({age:{$gt:18}})
查询年龄大于18 - 大于等于$gte
db.collection_name.find({age:{$gte:18}})
- 小于 $lt
db.collections_name.find({age:{$lt:18}})
查询年龄小于18 - 小于等于$lte
db.collection_name.find({age:{$lte:18}})
- 不等于 $ne
db.collection_name.find({age:{$ne:18}})
逻辑运算符
- and
- 在JSON中写多个条件即可:查询年龄大于或等于18, 并且性别为true的学生
db.collections_name.find({age:{$gte:18}},gender:"true"})
- or $or
- 使用$or 值为数组,数组中每个元素为json:查询年龄大于18, 或性别为false的学生
db.collection_name.find({$or:[{age:{$gte:18}},{gender:true}]})
- 形式
db.collection_name.find({$or:[{条件1},{条件2},{条件3}.....]})
范围运算符
- 使用” in"," i n " , " nin” 判断是否在某个范围内查询年龄为18、 28
db.collection_name.find({age:{$in:[18,28]}})
$nin 不在范围内
db.collections_name.find({age:{$gt:{$in:[25,16]}}})
mongodb的语句
选择年龄大于等于18并且gender为ture
db.stu.find({age:{$gte:18},gender:ture})
选择年龄是16,18,20 并且hometown为蒙古 或者gender 为ture
db.collection_name.find({$or:[{age:{$in:[16,18,20]},hometown:"蒙古"},{gender:true}]})
支持正则表达式(两种方式)
- 使用 /xxx/
db.collection_name.find({sku:/^a/})
查找sku字段中以a开头的db.collections_name.find({sku:/9$/})
查找sku字段中以9结尾的
- $regex 编写正则 值必须时字符串
db.collection_name.find({sku:{$regex:"^a"}})
查找sku字段中以a开头的db.collections_name.find({sku:{$regex:"9$""}})
查找sku字段中以9结尾的
limt skip
- 方法limit(): 用于读取指定数量的文档db.集合名称.find().limit(NUMBER)
db.collection_name.find().limit(2)
取两条
- 方法skip(): 用于跳过指定数量的文档db.集合名称.find().skip(NUMBER)
db.collection_name.find().skip(2)
跳过两条
- 连用
db.collection_name.find().limit(2).skip(2)
先取两页再跳过2条db.collections_name.find().skip(2).limi(2)
先跳两页,再取2条 —–比较高效常用
sort排序
db.collections_name.find({}).sort({name:1,gender:-1})
1为升序,-1为降序
统计 count
db.collections_name.find().count()
db.collections_name.count({gender:true})
统计geder:true的个数
去重distinct
db.collections_name.distinct("去重字段",{条件})
db.collections_name.distinct("hometown",{gneder:true,age:{$gt:18}})
- 给hometown字段去重,并且gender为true ,age大于18的
返回的是一个列表
聚合
- 是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果
db.collections_name.aggregate(管道:{表达式})
常用管道
$group
将文档分组,可用于统计结果$match
过滤,输出符合条件的文档$project
修改文档的结构,如:重命名,增加,删除字段,创建统计结果$sort
将文档排序后,输出$limt
限制聚合管道返回的档数,取几条$skip
跳过指定数量的文档, 并返回余下的文档$unwind
将数组类型的字段进行拆分
表达式
- 处理输出文档并输出
语法:表达式:'$列名'
{$..:{}}
- 常用表达式:
-
sum:计算总和,
s
u
m
:
计
算
总
和
,
sum:1 表示以1倍计数
表示把每一条数据当作1来计算
- $avg: 计算平均值
- $min: 获取最小值
- $max: 获取最大值
- $push: 在结果文档中插入值到一个数组中
- $first: 根据资源文档的排序获取第1个文档数据
- $last: 根据资源wenwen档的排序获取最后1个文档数据
连用
$group
- 按照一个字段分组
db.stu.aggregate({$group:{_id:"$hometown",age_sum:{$sum:"$age"}}})
- 按照两个字段分组
db.stu.aggregate({$group:{_id:{hometown:"$hometown",name:"$name"},sum:{$sum:1}}})
- 不分组,统计整个文档,将id设为null
db.stu.aggregate({$group:{_id:null,count:{$sum:1}}})
- $match
- db.col.aggragate({match:{age:{ match:{age:{ gt:18}}})
- 过滤
- $project
- db.col.aggragate({project:{_id:0,name:1,new_country:" project:{_id:0,name:1,new_country:" country”}})
- $sort
- db.col.aggragate({$sort:{name:1}})
- $limit
- db.col.aggragate({$limit:20})
- $skip
- db.col.aggragate({$skip:20})
- $unwind
- db.col.aggragate({ unwind:" u n w i n d :" size”})
- 属性 值为false表示丢弃属性值为空的⽂档属性
preserveNullAndEmptyArrays
值为true
表示保留属性值为空的⽂档用法: - db.col.aggragate({unwind:{path:" unwind:{path:" size”,perserveNullandEmptyArray:true}})
db.stu.find() { "_id" : ObjectId("5a0401d5507a7101e4eaa600"), "name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true } { "_id" : ObjectId("5a0401d6507a7101e4eaa601"), "name" : "⻩蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false } { "_id" : ObjectId("5a0401d6507a7101e4eaa602"), "name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false } { "_id" : ObjectId("5a0401d6507a7101e4eaa603"), "name" : "⻩药师", "hometown" : "桃花岛", "age" : 40, "gender" : true } { "_id" : ObjectId("5a0401d6507a7101e4eaa604"), "name" : "段誉", "hometown" : "⼤理", "age" : 16, "gender" : true } { "_id" : ObjectId("5a0401d6507a7101e4eaa605"), "name" : "段王爷", "hometown" : "⼤理", "age" : 45, "gender" : true } { "_id" : ObjectId("5a0401d7507a7101e4eaa606"), "name" : "洪七公", "hometown" : "华⼭", "age" : 18, "gender" : true } db.stu.aggregate({$group:{_id:"$hometown",age_sum:{$sum:"$age"}}}) 将属于华山的年龄想加,属于大理的年龄相加 { "_id" : "华⼭", "age_sum" : 18 } { "_id" : "⼤理", "age_sum" : 61 }
平均值
db.stu.aggregate({$group:{_id:"$hometown",avg:{$avg:"$age"}}})
{ "_id" : "华⼭", "avg" : 18 }
{ "_id" : "⼤理", "avg" : 30.5 }
{ "_id" : "桃花岛", "avg" : 29 }
{ "_id" : "蒙古", "avg" : 19 }
统计
- 将hometown 分组,,然后统计
db.stu.aggregate({$group:{_id:"$hometown",sum:{$sum:1}}})
{ "_id" : "华⼭", "sum" : 1 }
{ "_id" : "⼤理", "sum" : 2 }
{ "_id" : "桃花岛", "sum" : 2 }
{ "_id" : "蒙古", "sum" : 2 }
动手
db.tv3.aggregate({$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}},{$group:{_id:{country:'$_id.country',province:'$_id.province'},count:{$sum:1}}})
unwind
-将⽂档中的某⼀个数组类型字段拆分成多条, 每条包含数组中的⼀个值
语法:db.集合名称.aggregate({
unwind:′
u
n
w
i
n
d
:
′
字段名称’})
- db.t2.insert({_id:1,item:’t-shirt’,size:[‘S’,’M’,’L’]})
db.t2.aggregate({ unwind:′ u n w i n d : ′ size’})结果如下:
{ "_id" : 1, "item" : "t-shirt", "size" : "S" }
{ "_id" : 1, "item" : "t-shirt", "size" : "M" }
{ "_id" : 1, "item" : "t-shirt", "size" : "L" }
投影
- 返回特定的字段
db.collection_name.find({条件},{name:1,_id:0})
_id
不需要显示的时候,值为0,其他字段不需要的时候,不写即可显示时值为1db.collections_name.find({条件},{name:1,_id:0})
显示name 不显示其他字段,不需要id时就爱那个id设为0
统计个数
- db.collection_name.find({条件}).count()
- db.collection_name.count({条件})
去重
- db.stu.distinct(“hometown”,{gender:true,age:{$gt:18}})
- 返回数组
索引
- 创键索引
db.colllectons_name.ensureIndex({属性:1})
语法:db.集合.ensureIndex({属性:1}),1表示升序, -1表示降序具体操作:`db.t1.ensureIndex({name:1})“
db.collection_name.creatreIndex({属性:1}).explain('executionStats')
explain(‘executionStats’)查看查询的时间- 创建唯一索引
db.collections_name.ensureindex({name:1},{"unique":true})
- 创建联合索引——去重一般用三个字段
db.collection_name.ensureindex({name:1,age:1})
- 查看索引
db.collection_name.getindexes()
- 删除索引
db.collection_name.dropindex()
数据去重
- 数据库建立索引,需要建立联合索引,通过数据库来实现数据的自动去重
- 根据url地址去重,把url地址存在redis的集合中,后续新来一个url地址,判断他是否存在redis中,不存在才抓取
- url对应的响应不会变化的时候
- 使用sha1加密数据(可以选择加密某些字段),把得到的结果存入redis的集合中,后续新抓到的数据同样的方式进行加密,判断得到的值在redis的集合中是否存在,存在就更新,不存在就插入