爬虫 mysql mongodb_Python爬虫-MongoDB

Python爬虫-MongoDB

前言

如果仅考虑自己爬虫自己使用,我是推崇MongoDB的——暴力直接。一个字典insert下去,世界从混沌归于一片宁静。况且与MySQL相比,MongoDB的结构不用固定,其域(也就是MySQL中的列),可以在这个文档中6个,下个文档里4个。也不用考虑数据类型匹不匹配。当然不得不说其实各有千秋的,这里就不深究啦!

由于操作起来着实简单,上篇【二进制记得】也试演过一次,这里就不再实战了。

与MySQL对比

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table

collection

数据库表/集合

row

document

数据记录行/文档

column

field

数据字段/域

index

index

索引

table joins

表连接/mongodb不支持

primary key

primary key

主键/mongodb自动将_id设置主键

三原素:数据库,集合,文档

启动/关闭MongoDB

win : mongod.exe --dbpath=D:\mongodb\data\db (指定存放路径)

linux :mongod start/stop

操作

进入shell:mongo

退出shell:exit

爬虫 mysql mongodb_Python爬虫-MongoDB_第1张图片

数据库操作

查看当前数据库名字:db

查看当前数据状态:db.stats()

显示所有数据库:show dbs

切换数据库:use 数据库名(如果数据库不存在,就指向数据库但不会创建,直到插入数据或是创建集合之后才会创建数据库)

删除数据库:db.dropDatabase() (先切换到将要删除的数据库,删除数据库之后并不会立马退出,但被删除的数据库已经不存在了)

爬虫 mysql mongodb_Python爬虫-MongoDB_第2张图片

爬虫 mysql mongodb_Python爬虫-MongoDB_第3张图片

爬虫 mysql mongodb_Python爬虫-MongoDB_第4张图片

集合操作

创建集合:db.createCollection(name, options)

举例:

a. db.createCollection("comments", {capped:true, size:10, max:2})

b. db.createCollection("comments") (capped默认false,即无上限;size指大小,单位字节;max指数量上限)只有在用了size的情况下才能用max

查看当前所有集合:show collections

3f34b865af77b7feaf273724662b6db3.png

删除集合:db.集合名.drop()

数据操作

db.集合名.insert(document)document是构建的一个json文件(可以类比python中的字典)

爬虫 mysql mongodb_Python爬虫-MongoDB_第5张图片

db.集合名.remove({条件})

db.集合名.remove({条件}, {justOne:true})

以上都不能对创建集合时设置了capped:true的集合删除;对于capped:true的集合,只能删除文档

更新数据:db.集合名.update({原属性}, {修改属性}, {multi:true})(默认multi值为false,只更新一条;如果true,表示更新区配到的整个文档)

爬虫 mysql mongodb_Python爬虫-MongoDB_第6张图片

如果原属性存在,但修改属性里没写,这个属性在修改后就不存在了;相反,如果原属性不存在,但修改属性里有,修改后增加相应的属性

指定属性更新数据:db.集合名.({原属性}, {$set:{属性}}, {multi:true})

与1不同的是,在指定属性更新里面,原属性存在,修改属性里没写不会消失;而原属性不存在,修改属性里写了的,会增加

db.集合名.find()显示全部文档

db.集合名.findOne()显示第一条文档

爬虫 mysql mongodb_Python爬虫-MongoDB_第7张图片

保存

db.集合名.save{文档}

保存是指,如果主键已经存在,就执行更新(update)功能;如果不存在,就执行插入(insert)功能(主键就是_id,如果没写,系统会自动分配一个)

运算符

$lt/lte/gt/gte/ne,小于/小于等于/大于/大于等于/不等于,默认则等于

408590dd44b49442821efef12afd92a7.png

用法:db.集合名.find({条件})

and:db.集合名.find({条件1, 条件2, ...})

4f3e07eb0c83fb4eb10a0d9928dbeebc.png

满足条件1并且满足条件2,如果没有符合条件的数据,则无返回

or:db.集合名.find({$or:[{条件1}, {条件2}]})

a665a4f9f30fbdfdfdd3aaec7ce228b5.png

满足条件1或者条件2

and, or的组合使用:db.集合名.find({$or:[条件1, 条件2...], 条件3, ...})

24275863d1762b4ee6412256ee071c5a.png

满足条件1或者条件2的同时,必须满足条件3

范围:db.集合名.find({a:{$in:[1, 2, 3]}})

3fcd40fc509a2742e622fea371428f34.png

a的值的范围应该是中括号里枚举出来的范围

支持正则,以下图数据为例

爬虫 mysql mongodb_Python爬虫-MongoDB_第8张图片

使用正则有以下两种方法,结果都是一样的

a. db.comments.find({name:/^黄/})

b. db.comments.find({name:{$regex:"^黄"}})

爬虫 mysql mongodb_Python爬虫-MongoDB_第9张图片

自定义查询:db.集合名.find({$where:function(){return this.age<25}})这里其实利用的是javascript的知识,function(){…}是js中的匿名函数。有编程基础的应该能够看懂,就是返回age值小于25的数据

爬虫 mysql mongodb_Python爬虫-MongoDB_第10张图片

读取指定数量的文档:db.集合名.find(...).limit(n)表示显示满足条件的前n条数据

跳过指定数量的文档:db.集合名.find(...).skip(n)表示跳过前n条满足条件的数据,再显示

limit和skip可以一起使用,不分先后顺序

爬虫 mysql mongodb_Python爬虫-MongoDB_第11张图片

投影(显示自己需要的字段):db.集合名.find({条件...}, {字段1:1,字段2:1}),这里1表示显示的意思,0为默认值,即不显示,但针对_id字段,必须指定0,才会不显示

爬虫 mysql mongodb_Python爬虫-MongoDB_第12张图片

排序:db.集合名.find().sort({age:1, level:-1})(1表示升序,-1表示降序;先按照age升序,再按照level降序)

统计个数:db.集合名.count({条件})

消除重复:db.集合名.distinct("预设字段", {条件}),按条件返回预设字段,如果预设的字段出现重复就去重

爬虫 mysql mongodb_Python爬虫-MongoDB_第13张图片

爬虫 mysql mongodb_Python爬虫-MongoDB_第14张图片

高级操作

聚合

db.集合名.aggregate([{管道:{表达式}}])

常用管道

$group:将集合中的文档分组,可用于统计结果

$match:过滤数据,只输出符合条件的文档

$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果

$sort:将输入文档排序后输出

$limit:限制聚合管道返回的文档数

$skip:跳过指定数量的文档,并返回余下的文档

$unwind:将数组类型的字段进行拆分

常用表达式

$sum:计算总和,$sum:1同count表示计数

$avg:计算平均值

$min:获取最小值

$max:获取最大值

$push:在结果文档中插入值到一个数组中

$first:根据资源文档的排序获取第一个文档数据

$last:根据资源文档的排序获取最后一个文档数据

==这里不深入,因为我认为爬虫暂时用不到这些功能,用不到的知识,学了只是负担,对一般人而言的话==

安全性

MongoDB是默认不需要密码的,但为了安全性,可以设置

第一步:use admin

第二步:db.createUser({user:..., pwd:..., roles:[role:..., db:...]})

爬虫 mysql mongodb_Python爬虫-MongoDB_第15张图片

针对role:

root:只在admin数据库中可用,超级账号,超级权限

Read:允许用户读取指定数据库

readWrite:允许用户读写指定数据库

第三步:sudo vim /etc/mongodb.conf 开启认证

60dc80741c76a71d5b29a6b21c795e4b.png

第四步:重启mongodb

此时如果mongo,切换admin,对这个数据库操作将会报错

爬虫 mysql mongodb_Python爬虫-MongoDB_第16张图片

所以需要认证的方式登陆

爬虫 mysql mongodb_Python爬虫-MongoDB_第17张图片

语句:mongo -u "" -p "" --authenticationDatabase "数据库"

修改用户密码:db.updateUser("用户名", {pwd:"..."})

与python交互

导入模块:import pymongo

连接mongo:client = pymongo.MongoClient("localhost", 27017)

指定数据库:db = clients.数据名

指定集合:collection = db.集合名

内置方法1:

insert_one()insert_many()

update_one()/update_many()

delete_one()/delete_many()

find_one()/find()

remove_one()/remove_many()

在mongodb中,insert({“name”:”郭靖”})和insert({name:”郭靖”})效果是一样的;但是在与python的交互中,必须前者,后者会报错(其实就是参数得是字典啦)

利用find()函数,返回的是一个迭代器,需要用next或者for遍历

爬虫 mysql mongodb_Python爬虫-MongoDB_第18张图片

内置方法2:

count() 统计总数

sort() 排序

爬虫 mysql mongodb_Python爬虫-MongoDB_第19张图片

如果是pymon.ASCENDING则为升序;多属性排序:sort([(...), (...)])

你可能感兴趣的:(爬虫,mysql,mongodb)