MongoDB
简介
- MongoDB —— 非关系型数据库(像关系型数据库的非关系型数据库),数据类型灵活
- 优势
- 无数据结构限制,业务开发方便快捷
- 大数据量和高性能 —— 读写性能高
- 良好的支持 —— 支持跨平台安装
安装
- 下载地址:https://www.mongodb.com/download-center/community
- 安装 —— 教程:https://www.cnblogs.com/chy18883701161/p/11100560.html
- 必须有data和log文件夹
- 将MongoDB下的bin文件夹添加到环境变量
MongoDB的使用
数据库命名规范
- 不能为空的字符串
- 不能含有特殊字符
- 全部小写
- 不能和系统保留的数据库重名
- 最多64个字节
MongoDB中的概念
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 字段/域 |
index | index | 索引 |
primary key | primary key | 主键 |
文档
- 概念 —— 是由字段和值对组成(结构为:{field1:value1,field2:value2,…})
- 值的数据类型 —— 包括其他文档、数组和文档数组
{
_id: ObjectId("5099803df3f4948bd2f98391"),
name: { first: "Alan", last: "Turing" },
birth: new Date('Jun 23, 1912'),
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : NumberLong(1250000)
}
MongoDB的数据类型
数据类型 | 描述 |
---|
String | 字符串。存储数据常用的数据类型,在MongoDB中,UTF-8编码的字符串才是合法的 |
Integer | 整型数值。用于存储数值。根据采用的服务器,可分为32位或64位 |
Boolean | 布尔值。用于存储布尔值 |
Double | 双精度浮点值。用于存储浮点值 |
Min/Max keys | 将一个值与BSON(二进制的JSON)元素的最低值和最高值相对比 |
Array | 用于将数组或列表或多个值存为一个键 |
Timestamp | 时间戳。记录文档修改或添加的具体时间 |
Object | 用于内嵌文档 |
Null | 用于创建空值 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是它一般用于采用特殊符号类型的语言 |
Date | 日期时间。用UNIX时间格式来存储当前日期或时间。可以指定自己的日期时间:创建Date对象,传入年月日信息 |
Object ID | 对象ID。用于创建文档的ID |
Binary Data | 二进制数据。用于存储二进制数据 |
Code | 代码类型。用于在文档中存储JavaScript代码 |
Regular expression | 正则表达式类型。用于存储正则表达式 |
启动和连接MongoDB
- 启动:mongod --dbpath path # path必须到data文件夹
- 连接:mongo # 新打开命令提示符窗口
基本使用
常用命令 | 含义 |
---|
show dbs | 查看数据库(自带3个数据库尽量不要使用:admin,config,local) |
use 数据库名 | 选择使用的数据库,如果database没有则创建database的数据库 |
db | 查看当前使用的数据库 |
show collections/table | 查看集合/表 |
db.dropDatabase() | 删除当前选择的数据库 |
条件操作符
条件操作符 | 含义 |
---|
$gt | 大于符号 |
$lt | 小于符号 |
$gte | 大于等于符号 |
$lte | 小于等于符号 |
$ne | 不等于符号 |
$eq | 等于符号 |
$ifNull | 判断null |
$in | 范围运算符,包含的意思,值为数组 |
$nin | 范围运算符,不包含的意思,值为数组 |
$all | 范围运算符,匹配所有,值为数组 |
$or | 逻辑运算符,或的逻辑,值为数组 |
$and | 逻辑运算符,与的逻辑,值为数组 |
$not | 逻辑运算符,非得逻辑,值为数组 |
$concat | 字符串连接操作 |
$substr | 字符串截取操作 |
$toLower | 字符串转小写操作 |
$toUpper | 字符串转大写操作 |
$size | 数组元素个数计算,值为数字 |
/value/ | 模糊查询,根据value进行模糊查询 |
$exists | 判断字段是否存在 |
$regex | 正则表达式匹配 |
$ | 占位符 |
集合/表的创建、删除和查询
- MongoDB分为手动和自动建表
- 自动建表 —— 向一个不存在的集合插入数据,这个集合就会被创建出来
常用命令 | 含义 |
---|
db.集合名.insert(文档) | 向表插入数据,数据为{}里的内容。如果集合不存在则创建collectionname的集合再插入数据 |
db.createCollection(name,{options}) | 创建集合。name是集合名;options为可选参数(指定内存大小及索引的选项),options的参数capped默认值为false表示不设置上限,值为true表示设置上限;当capped为true时,options的参数size必须填写,表示上限大小(mongo中上限小于256则默认为256),当文档达到上限时会覆盖数据,单位为字节 |
db.集合名.find() | 查找表内所有数据 |
db.集合名.isCapped() | 查看表是否设置上限,如果为false则没有上限,如果为true则有上限 |
db.集合名.drop() | 删除表 |
插入数据
常用命令 | 含义 |
---|
db.集合名.insert([文档1,文档2…]) | 向表内插入Array类型数据,数据库中显示为多条数据 |
db.集合名.save(文档1,文档2…) | 更新数据。当数据中有id时,根据id进行数据更新;当数据中没有id或id不存在时插入数据 |
查询数据
常用命令 | 含义 |
---|
db.集合名.find(文档).pretty() | 查询集合中所有数据,文档为可选条件,如果添加文档则查询集合中符合文档的所有数据。pretty为可选方法,作用为格式化数据(使数据更清晰) |
db.集合名.findOne(文档) | 查询集合中第一个数据。文档为可选条件,如果添加文档则查询集合中第一次出现文档的数据 |
db.集合名.find(‘array.number’:value) | 数组内查询时,array.number为array的索引值,根据索引值查找数据 |
db.集合名.find({array:{$size:number}}) | 数组内查询时,查找数组数量为number的数据 |
db.集合名.find({‘array.field’:value}) | 数组内查询时,查询数组内文档的数据 |
db.集合名.find({array:{$elemMatch:query1,query2,…}) | 数组内查询时,数组中至少一个array的值满足所有条件 |
db.集合名.find({field:value},{array:{$slice:count}} | 返回指定位置的数组元素值的子集,当count为1时显示数组内第一条数据;当count为-1时显示数组内最后一条数据;当count为索引范围时([number1,number2])显示数组内第number1到number2-1条数据,number1从0开始 |
db.集合名.distinct(field,query) | 获取集合中指定字段的不重复值,并以数组的形式返回。field参数为指定返回的字段,query是可选参数为文档查询条件 |
db.hehe.find({age:{$lt:20})
db.hehe.find({age:{$lte:20},gender:'female'})
db.hehe.find({age:{$in:[16,20]}})
db.hehe.find({age:{$nin:[16,20]}})
db.hehe.find({$or:[{age:{$lt:18}},{gender:'female'}]})
db.hehe.find({$where:function(){return this.age<18}})
操作查询结果
方法 | 使用方法 | 含义 |
---|
count() | db.集合名.find(文档).count()或db.集合名.count(文档) | 查询结果计数 |
limit(number) | db.集合名.find(文档).limit(number) | 读取指定数量的文档 |
skip(number) | db.集合名.find(文档).skip(number) | 跳过指定数量的文档 |
skip(number).limit(number) | db.集合名.find(文档).skip(number).limit(number) | 跳过指定数量的文档后读取指定数量的文档 |
sort({field:1})/sort({field:-1}) | db.集合名.find(文档).sort({field:1})或db.集合名.find(文档).sort({field:-1}) | 排序。sort内field值为1时是升序(由小到大);sort内field值为-1时是降序(由大到小) |
映射
- 指定返回的字段,如果为1则返回该字段,如果为0则返回除了该字段外的所有字段。ID如果没写会默认返回
- 方法:db.集合名.find({文档},{field:1,field:0,…})
修改数据
- 第一方法:db.集合名.update({query},{update},{multi:boolean})
- query参数 —— 查询条件
- update参数 —— 更新操作符(默认修改整条数据,{$set:{文档}}为修改指定数据,其他数据保留)
- multi参数 —— 可选参数,默认为false,表示只更新找到的第一条数据;如果值为true,则把满足条件的数据全部更新
db.hehe.update({name:'haha'},{name:'abc'})
db.hehe.update({name:'heihei'},{$set:{name:'xyz'}})
删除数据
- 方法:db.集合名.remove({query},{justOne:true})
- query参数 —— 可选参数。如果有参数,则删除文档的条件;如果没有参数则删除集合内所有数据
- justOne参数 —— 可选参数。如果为true或1,则只删除1个数据,如果不设置或使用默认值false,则删除所有匹配条件的数据
聚合
- 概念 —— 处理数据(如求和,平均值等),并放回计算后的结果
- 方法:db.集合名.aggregate([管道])

管道
- 概念 —— 用于将当前命令的输出结果作为下一个命令的参数(可多管道同时使用)
常用管道符 | 使用方法 | 含义 |
---|
$porject | {$project:普通列,_id列,条件过滤列} | 控制数据列的显示规则。普通列({field:1/true})表示要显示的内容;_id列({‘_id’:0/false})表示_id是否显示;条件过滤列({field:表达式})为满足表达式之后的数据可以进行显示 |
$match | {$match:条件过滤列} | 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作 |
$limit | {$limit:number} | 用于限制MongoDB聚合管道返回的文档数 |
$skip | {$skip:number} | 用于在聚合管道中跳过指定数量的文档,并返回余下的文档 |
$unwind | {$unwind:field} | 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值 |
$group | {$group:{_id: expression,field1:{accumulator1:expression1},…}} | 将结合中的文档分组,可用于统计结果。_id强制必须存在,可以为null |
$sort | {$sort:{field:number}} | 将输入文档排序后输出(1为从小到大,-1为从大到小) |
算数表达式运算符
常用符号 | 使用方法 | 含义 |
---|
$sum | db.集合名.aggregate([{$group:{_id:"$by_user",num_tutorial:{$sum:expression}}}]) | 求和计算,$sum:1表示以一倍计数 |
$avg | db.集合名.aggregate([{$group:{_id:"$by_user",num_tutorial:{$avg:expression}}}]) | 计算平均值 |
$abs | db.集合名.aggregate([{$group:{_id:"$by_user",num_tutorial:{$abs:number}}}]) | 求绝对值 |
$add | db.集合名.aggregate([{$project:{num_tutorial:{$add:[expression]}}}]) | 将数字加在一起或添加数字和日期。如果参数之一是日期,则将其他参数视为要添加到该日期的毫秒数 |
$min | db.集合名.aggregate([{$group:{_id:"$by_user",num_tutorial:{$min:"$likes"}}}]) | 获取集合中所有文档对应值的最小值 |
$max | db.集合名.aggregate([{$group:{_id:"$by_user",num_tutorial:{$max:"$likes"}}}]) | 获取集合中所有文档对应值的最大值 |
$push | db.集合名.aggregate([{$group:{_id:"$by_user",url:{$push:"$url"}}}]) | 在结果文档中插入值到一个数组中 |
$addToSet | db.集合名.aggregate([{$group:{_id:"$by_user",url:{$addToSet:"$url"}}}]) | 在结果文档中插入值到一个数组中,但不创建副本 |
$first | db.集合名.aggregate([{$group:{_id:"$by_user",first_url:{$first:"$url"}}}]) | 根据资源文档的排序获取第一个文档数据 |
$last | db.集合名.aggregate([{$group:{_id:"$by_user",first_url:{$first:"$url"}}}]) | 根据资源文档的排序获取最后一个文档数据 |
MongoDB索引操作
查看索引
创建索引
删除索引
- 方法:db.集合名.dropIndex(keys)
python与MongoDB交互
- 安装模块 —— pip install pymongo
- 导入模块 —— import pymongo
- 连接MongoDB —— pymongo.MongoClient()
- 使用类进行增删改查(必须使用cmd连接MongoDB)
Scrapy与MongoDB交互
settings文件添加MongoDB相关内容
- 添加host —— MONGODB_HOST
- 添加port —— MONGODB_PORT
- 添加数据库 —— MONGODB_DATABASENAME
- 添加集合 —— MONGODB_COLLECTIONNAME
修改pipelines文件
- MyspiderPipeline内添加init方法
- process_item方法内向MongoDB插入数据
- 将item参数转换为字典(dict(item))
- insert(data)