爬虫基础知识(柒)
Mongodb数据库
一、MongoDB简介:
1、Mongodb:文档数据库,存储的是文档(Bson→json的二进制化),json数据存储的就是js中对象和数组。
2、MongoDB特点:内部执行引擎为JS解释器,把文档储存成bson结构,在查询时转换为JS对象,并可以通过熟悉的js语法来操作。
3、Mongo和传统型数据库的不同:
- 传统型数据库:结构化数据,定好了表结构后,每一行的内容必是符合表结构的,就是说一列的数据,类型都一样。
- mongo文档型数据库:集中存储的每篇文档,都可以有自己独特的结构(json对象都可以有自己独特的属性和值)。
- mongo数据库的collection不用提前创建(可以隐式创建)
- 传统型数据库:结构化数据,定好了表结构后,每一行的内容必是符合表结构的,就是说一列的数据,类型都一样。
4、mongodb数据库bin目录下的文件意义:
5、mongo入门命令:
6、如何创建库:
MongoDB的库是隐式创建,你可以use一个不存在的库,然后在该库下创建collection,即可创建库
use dbname ---ues一个不存在的库 db.createCollection(‘collectionName’) ---在该库下面创建集合,就可以创建一个数据库
其实在MongoDB中,collection也是可以隐式创建的。
db.collectionName.insert(document)
如何删除数据库和集合?
db.collectionName.drop()//删除集合 db.dropDatabase()//删除数据库
二、MongoDB的操作
1、增:insert方法
首先要明确一点,MongoDB存储的是文档,文档其实就是json格式的对象。
语法:
db.collectionName.insert(document)
增加单篇文档:
db.collectionName.insert({title:‘nice day‘})
增加单个文档并指定id:
db.collectionName.insert({_id:8,age:78})
增加多个文档:
db.collectionName.insert([{time:‘friday‘,study:‘mongodb‘},{_id:9,gender:‘male‘,name:‘QQ‘}])
2、查:find方法
语法:
db.collection.find(查询表达式,查询的列);
db.collection.find(表达式,{列1:1,列2:1});
在查询列的参数中,1表示显示,0表示不显示(_id属性默认是显示的)。
常用方法:
·limit():
db.collection.find().limit(number);
·skip():
db.collection.find().skip(number);
·sort():
db.collection.find().sort({KEY:1});
·count():
db.collection.find().count();
3、查询表达式
· : 等于
db.collection.find({key:value},{_id:0});
· $lt 小于
db.collection.find({key:{$lt:value}},{key:1});
· $lte 小于等于
· $gt 大于
· $gte 大于等于
· $ne 不等于
db.collection.find({key:{$ne:value}},{key:1})
· $in 存在其中一个或多个值
db.collection.find({key:{$in:[value1,value2]}},{key:1})
· $nin 不存在数组中的值
· $all 数组中的值全存在
db.collection.find({key:{$all:[value1,value2]}},{key:1})
· $exists 含有字段
db.collection.find({key:{$exists:1}},{key:1})
· $nor 所有条件都不满足
db.collection.find({$nor:[key1:value1,key2:value2]},{_id:0})
· $and 所有条件都满足
db.collection.find({$and:[key1:value1,key2:value2]},{_id:0})
· $or 条件至少满足一个
db.collection.find({$or:[key1:value1,key2:value2]},{_id:0})
4、删:remove方法
db.collection.remove(查询表达式,选项)
选项是指{justOne:true/false},是否只删除一行,默认为false
如果不写查询表达式,collection中的所有数据都将被删掉。
5、改:update方法
db.collection.update(查询表达式,新值,选项)
修改时的赋值表达式:
· $set 修改某列的值
· $unset 删除某个列
· $rename 重命名某个列
· $inc 增长某个列
选项参数:
· upsert 指没有匹配的行,则直接插入该行,值为true或false
· multi 指修改多行,默认为false,如果想修改多行,则设为true
6、聚合函数
聚合主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。
db.collection.aggregate([{管道1},{管道2},{管道3}...])
mongodb的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理,管道操作是可以重复的。
聚合框架中的常用管道操作:
· $project : 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
· $match : 用来过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
· $limit : 用来限制MongoDB聚合管道返回的文档数。
· $skip : 在聚合管道中跳过指定数量的文档,并返回余下的文档。
· $group : 将集合中的文档分组,可用于统计结果。
· $sort : 将文档排序后输出。
group中的操作表达式:
三、游标操作
1、游标的概念及作用:
mongo的游标相当于python中的迭代器。通过将查询结构定义给一个变量,这个变量就是游标。通过这个游标,可以每次获取一个数据。
2、游标的声明:
var cursor=db.bar.find()
3、游标的操作:
cursor.hasNext() 判断游标是否还有下个数据
cursor.next() 取出游标的下一个单元
4、cursor.forEach(回调函数):
var gettile = function(obj){print(obj.goods_name)}
var cursor=db.goods.find()
cursor.forEach(gettile)
5、游标在分页中的应用:
在MongoDB中,用skip和limit方法实现
例:var cursor=db.bar.find().skip(90).limit(20)
四、索引创建
优化查询的首要考虑的就是索引。
·索引提高查询速度,降低写入速度
·在MongoDB中,索引可以按字段升序/降序来创建,便于排序
·默认是用btree来组织索引文件,在2.4版本后,也允许建立hash索引。
常用命令:
(1)查看当前索引状态:db.collection.getIndexes()
(2)创建普通单列索引:db.collection.ensureIndex({field:1/-1})//1为正序,-1为逆序
(3)删除单个索引:db.collection.dropIndex({field:1/-1})
(4)删除所有索引:db.collection.dropIndexes()
(5)创建多列索引:db.collection.ensureIndex({field1:1/-1,field2:1/-1})
(6)哈希索引:db.collection.ensureIndex({field:‘hashed‘})
(7)唯一索引:db.collection.ensureIndex({field:1/-1},{unique:true})
五、MongoDB数据的导入导出
1、通用选项:
--host 主机
--port 端口号
-u 用户名
-p 密码
2、mongoexport导出(json格式或CSV格式):
-d 库名
-c 表名
-f 列名
-q 查询条件
-o 导出至地址及文件名
--type csv 导出CSV格式(便于二和传统数据库交换数据)
3、mongoimport导入:
-d 待导入的数据库
-c 待导入的表(不存在的话会自己创建)
--file 备份文件路径
4、mongodump导出二进制bson结构的数据及其索引信息:
-d 库名
-c 表名
规律:
导出的文件放在database命名的目录下
每个表导出两个文件,分别是bson结构的文件和json的索引信息
若不声明表名,导出所有的表
5、mongorestore导入二进制文件:
-d 库名
-c 表名
--dir 路径