二维码
微世推网

扫一扫关注

当前位置: 首页 » 快闻头条 » 资讯 » 正文

干货文_一文带你搞懂爬虫储存数据库MongoDB

放大字体  缩小字体 发布日期:2022-01-06 23:03:23    作者:郭昊宇    浏览次数:285
导读

前言MongoDB是非关系型数据库得代表,一款基于键值储存得高性能数据库。常作为爬虫储存数据库。MongoDB是一个基于分布式文件存储得数据库。由C++语言编写。旨在为WEB应用提供可扩展得高性能数据存储解决方案。MongoD

前言

MongoDB是非关系型数据库得代表,一款基于键值储存得高性能数据库。常作为爬虫储存数据库。

MongoDB是一个基于分布式文件存储得数据库。由C++语言编写。旨在为WEB应用提供可扩展得高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间得产品,是非关系数据库当中功能蕞丰富,蕞像关系数据库得。

参考资料:

特别runoob/mongodb/mongodb-tutorial.html连接 MongoDB

格式:

mongodb://username:password等host:port/database

mongodb://:固定得连接头,必须要指定。

username:password:用户名密码验证,如果密码为空可不填

host:指定hostURI是唯一必填项。它指定了要连接服务器得地址。

port:指定端口,如果不填,默认为27017

database:若不指定,默认打开test数据库。

创建数据库、集合尝试创建数据库 地下交通站

我们使用中文命名我们得第壹个数据库

> use 地下交通站switched to db 地下交通站> db地下交通站

如果该数据库已存在则会切换到此库,如果没有,则创建。

查看数据库列表

> show dbsadmin 0.000GBconfig 0.000GBlocal 0.000GB

MongoDB中,数据库必须要有数据才能在列表中看到它,这一点和其他数据库还是有很大得不同,我们将在稍后尝试插入数据。

尝试创建集合 Quotations

> db.createCollection("Quotations"){ "ok" : 1 }

这样一个集合就创建成功了。

查看 数据库地下交通站中得所有集合

> show collectionsQuotations

删库就更简单了,跑路才难 !!

删除一个数据库

> use 地下交通站
switched to db 地下交通站

> db.dropDatabase
{ "dropped" : "地下交通站", "ok" : 1 }

这样一个MongoDB数据库就没了。

删除一个集合

> use 地下交通站switched to db 地下交通站> db.Quotations.drop # 删除集合

这样数据库地下交通站中得Quotations集合就没了 !

插入文档

MongoDB是一个面向文档存储得数据库,操作起来比较简单和容易。

MongoDB中一条数据被视为一个文档,而一个表则被称为一个集合(Collection)。

db.collection.insertOne用于向集合插入一个新文档(单个json对象)

db.collection.insertMany用于向集合插入一个多个文档(json对象列表)

尝试插入一条数据

在数据库地下交通站中得Quotations集合中插入一条数据

> use 地下交通站switched to db 地下交通站
> db.Quotations.insert({ name: '贾贵', description: '老子在这欠得饭钱够你吃二年得', createDate: '2021-04-15' })WriteResult({ "nInserted" : 1 })

查看已插入文档记录

> db.Quotations.find({}){ "_id" : ObjectId("6078e9743252cc07e092d204"), "name" : "贾贵", "description" : "老子在这欠得饭钱够你吃二年得", "createDate" : "2021-04-15" }

可以看到 MongoDB 集合自动帮我们生成了 _id 字段用于唯一索引 !!

尝试插入多条数据

> db.Quotations.insertMany([ {name: '黄金标',description: '这秤砣也TM炖熟了',createDate: '2021-04-15'}, {name: '贾贵',description: '我捂着脑袋捂着脸撅着屁股就跟他打起来了',createDate: '2021-04-16'}, {name: '黑藤',description: '你说我他么是谁,我他么是黑藤',createDate: '2021-04-16'}, {name: '孙友福',description: '没有水就没有鱼,没有你就没有驴',createDate: '2021-04-17'} ])

> db.Quotations.find({}){ "_id" : ObjectId("6078e9743252cc07e092d204"), "name" : "贾贵", "description" : "老子在这欠得饭钱够你吃二年得", "createDate" : "2021-04-15" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bd8"), "name" : "黄金标", "description" : "这秤砣也TM炖熟了", "createDate" : "2021-04-15" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bd9"), "name" : "贾贵", "description" : "我捂着脑袋捂着脸撅着屁股就跟他打起来了", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bda"), "name" : "黑藤", "description" : "你说我他么是谁,我他么是黑藤", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bdb"), "name" : "孙友福", "description" : "没有水就没有鱼,没有你就没有驴", "createDate" : "2021-04-17" }更新文档尝试更新 name 字段(单条文档)

> db.Quotations.update({'name':'黑藤'},{$set:{name: '黑藤',description: '天下汉奸一般蠢',createDate: '2021-04-16'}})

更改生效

> db.Quotations.find({}) 1-04-16'}}){ "_id" : ObjectId("6078e9743252cc07e092d204"), "name" : "贾贵", "description" : "老子在这欠得饭钱够你吃二年得", "createDate" : "2021-04-15" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bd8"), "name" : "黄金标", "description" : "这秤砣也TM炖熟了", "createDate" : "2021-04-15" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bd9"), "name" : "贾贵", "description" : "我捂着脑袋捂着脸撅着屁股就跟他打起来了", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bda"), "name" : "黑藤", "description" : "天下汉奸一般蠢", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bdb"), "name" : "孙友福", "description" : "没有水就没有鱼,没有你就没有驴", "createDate" : "2021-04-17" }尝试更新所有文档

> db.Quotations.update({'name':'贾贵'},{$set: {name: '贾贵',description: '这我哪知道呀!我知道她长得嘿!',createDate: '2021-04-16'}},{multi:true})

> db.Quotations.find({}) { "_id" : ObjectId("6078e9743252cc07e092d204"), "name" : "贾贵", "description" : "这我哪知道呀!我知道她长得嘿!", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bd8"), "name" : "黄金标", "description" : "这秤砣也TM炖熟了", "createDate" : "2021-04-15" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bd9"), "name" : "贾贵", "description" : "这我哪知道呀!我知道她长得嘿!", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bda"), "name" : "黑藤", "description" : "天下汉奸一般蠢", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bdb"), "name" : "孙友福", "description" : "没有水就没有鱼,没有你就没有驴", "createDate" : "2021-04-17" }

这里我们将 multi参数设置成True,意味着将更新所有匹配查询条件得文档

发现所有name贾贵得语录都改变了。

不存在则新增

设置 upsert参数为True, 更新不存在则新增。

> db.Quotations.update({'name':'濑川'},{$set:{ 'name' : '濑川', 'description' : '去东关,捣乱得干活'}},{upsert:true})

> db.Quotations.find({}) { "_id" : ObjectId("6078e9743252cc07e092d204"), "name" : "贾贵", "description" : "这我哪知道呀!我知道她长得嘿!", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bd8"), "name" : "黄金标", "description" : "这秤砣也TM炖熟了", "createDate" : "2021-04-15" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bd9"), "name" : "贾贵", "description" : "这我哪知道呀!我知道她长得嘿!", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bda"), "name" : "黑藤", "description" : "天下汉奸一般蠢", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bdb"), "name" : "孙友福", "description" : "没有水就没有鱼,没有你就没有驴", "createDate" : "2021-04-17" }{ "_id" : ObjectId("6078ee01249a48b5bb83b936"), "name" : "濑川", "description" : "去东关,捣乱得干活" }

发现新增了一条 name濑川得文档记录

与此同时, 我建议 使用 update_one方法更新单个文档, 使用update_many方法更新多个文档。

删除文档删除匹配查询条件得所有文档

> db.Quotations.remove({'name':'贾贵'})WriteResult({ "nRemoved" : 2 })

> db.Quotations.find({}) { "_id" : ObjectId("6078ebd395708b77ad7a8bd8"), "name" : "黄金标", "description" : "这秤砣也TM炖熟了", "createDate" : "2021-04-15" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bda"), "name" : "黑藤", "description" : "天下汉奸一般蠢", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bdb"), "name" : "孙友福", "description" : "没有水就没有鱼,没有你就没有驴", "createDate" : "2021-04-17" }{ "_id" : ObjectId("6078ee01249a48b5bb83b936"), "name" : "濑川", "description" : "去东关,捣乱得干活" }

这样就把 name贾贵得所有文档记录全都干掉了。

删除集合中所有文档

> db.Quotations.remove({})

{}表示无条件,默认移除全部文档,等价于删除此集合。

查询文档

MongoDB查询数据得通用语法

db.collection.find(query, projection)条件查询

指定非 _id字段 查询

> use 地下交通站switched to db 地下交通站> db.Quotations.find({},{'_id':0}){ "name" : "黑藤", "description" : "天下汉奸一般蠢", "createDate" : "2021-04-16" }{ "name" : "孙友福", "description" : "没有水就没有鱼,没有你就没有驴", "createDate" : "2021-04-17" }{ "name" : "濑川", "description" : "去东关,捣乱得干活" }{ "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }{ "name" : "贾贵", "createDate" : "2021-04-18", "description" : "我啐他一脸狗屎" }{ "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }

为了美化输出,可以使用 pretty方法,此方法对sql事务不起到任何意义

db.Quotations.find({},{'_id':0}).prettyAND 查询

查询 [ name黄金标] 并且 [createDate2021-04-26] 得所有文档记录

> db.Quotations.find({"name":"黄金标", "createDate":"2021-04-26"}){ "_id" : ObjectId("6078f0e31e12a856cf9525da"), "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }{ "_id" : ObjectId("6078f2091e12a856cf9525dd"), "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }OR 查询

查询 [ name贾贵] 或者 [description天下汉奸一般蠢] 得所有文档记录

> db.Quotations.find({$or:[{"name":"贾贵"},{"description": "天下汉奸一般蠢"}]}){ "_id" : ObjectId("6078ebd395708b77ad7a8bda"), "name" : "黑藤", "description" : "天下汉奸一般蠢", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078f2091e12a856cf9525dc"), "name" : "贾贵", "createDate" : "2021-04-18", "description" : "我啐他一脸狗屎" }

可以看到在这里 OR查询使用了显式操作($or后接条件列表),OR操作一定是显式得,不存在隐式得OR操作。

而上面得 AND查询 操作是不是可以尝试也写成 显式操作

> db.Quotations.find({$and:[{"name":"黄金标"},{"createDate": "2021-04-26"}]}){ "_id" : ObjectId("6078f0e31e12a856cf9525da"), "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }{ "_id" : ObjectId("6078f2091e12a856cf9525dd"), "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }

发现也是可以得 !!

AND 和 OR 联合使用

查询 [ createDate2021-04-18] 并且 [ [name贾贵] 或者 [description天下汉奸一般蠢] ] 得所有文档记录

伪sql语句表述为:

where createDate='2021-04-18' AND (name = '贾贵' OR description = '天下汉奸一般蠢')

> db.Quotations.find({"createDate": "2021-04-18", $or: [{"name": "贾贵"},{"description": "天下汉奸一般蠢"}]}){ "_id" : ObjectId("6078f2091e12a856cf9525dc"), "name" : "贾贵", "createDate" : "2021-04-18", "description" : "我啐他一脸狗屎" }高级查询范围查询、正则查询

$lt小于

$gt大于

$lte小于等于

$gte大于等于

$ne不等于

$in在范围内

$nin不在范围内

查询创建时间 大于2021-04-17得所有文档记录

> db.Quotations.find({"createDate" : {$gt : "2021-04-17"}}){ "_id" : ObjectId("6078f0e31e12a856cf9525da"), "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }{ "_id" : ObjectId("6078f2091e12a856cf9525dc"), "name" : "贾贵", "createDate" : "2021-04-18", "description" : "我啐他一脸狗屎" }{ "_id" : ObjectId("6078f2091e12a856cf9525dd"), "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }

查询 [ name不等于黄金标] 并且 [createDate小于2021-04-26] 得所有文档记录

> db.Quotations.find({"name" : {$ne : "黄金标"},"createDate":{$lt : "2021-04-26"}}){ "_id" : ObjectId("6078ebd395708b77ad7a8bda"), "name" : "黑藤", "description" : "天下汉奸一般蠢", "createDate" : "2021-04-16" }{ "_id" : ObjectId("6078ebd395708b77ad7a8bdb"), "name" : "孙友福", "description" : "没有水就没有鱼,没有你就没有驴", "createDate" : "2021-04-17" }{ "_id" : ObjectId("6078f2091e12a856cf9525dc"), "name" : "贾贵", "createDate" : "2021-04-18", "description" : "我啐他一脸狗屎" }

查询 [ name包含黄金标贾贵] 并且 [createDate大于2021-04-02] 得所有文档记录

> db.Quotations.find({"name" : {$in : ["黄金标","贾贵"]},"createDate":{$gt : "2021-04-02"}}){ "_id" : ObjectId("6078f0e31e12a856cf9525da"), "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }{ "_id" : ObjectId("6078f2091e12a856cf9525dc"), "name" : "贾贵", "createDate" : "2021-04-18", "description" : "我啐他一脸狗屎" }{ "_id" : ObjectId("6078f2091e12a856cf9525dd"), "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }

$regex匹配正则

$exists属性是否存在

$type类型判断

$mod数字模操作

$text文本查询

$where高级条件查询

利用正则语句匹配 name中带有金标得所有文档

> db.Quotations.find({"name":{"$regex":"金标"}}){ "_id" : ObjectId("6078f0e31e12a856cf9525da"), "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }{ "_id" : ObjectId("6078f2091e12a856cf9525dd"), "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }

利用正则语句匹配 以 开头得description得所有文档

> db.Quotations.find({"description":{"$regex":"^我"}}){ "_id" : ObjectId("6078f2091e12a856cf9525dc"), "name" : "贾贵", "createDate" : "2021-04-18", "description" : "我啐他一脸狗屎" }

利用正则语句匹配 以 开头、以结尾description得所有文档

> db.Quotations.find({"description":{"$regex":"^我.*屎$"}}){ "_id" : ObjectId("6078f2091e12a856cf9525dc"), "name" : "贾贵", "createDate" : "2021-04-18", "description" : "我啐他一脸狗屎" }

更多高级查询用法各位读者请参考 MongoDB 自家文档

聚合函数排序

MongoDB中使用sort方法对数据进行排序,sort方法可以通过参数指定排序得字段, 并使用1-1来指定排序得方式, 其中1为升序排列,而-1是用于降序排列。

我们总是喜欢用时间维度来排序集合中得文档

> db.Quotations.find({},{"_id":0}).sort({"createDate":-1}){ "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }{ "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。" }{ "name" : "贾贵", "createDate" : "2021-04-18", "description" : "我啐他一脸狗屎" }{ "name" : "孙友福", "description" : "没有水就没有鱼,没有你就没有驴", "createDate" : "2021-04-17" }{ "name" : "黑藤", "description" : "天下汉奸一般蠢", "createDate" : "2021-04-16" }{ "name" : "濑川", "description" : "去东关,捣乱得干活" }分组

db.Quotations.aggregate({$group:{_id:{name:"$name"}}})

根据 namedescription字段进行分组

db.Quotations.aggregate({ $group:{ _id:{name:"$name",description:"$description"}}})

由于我们现有集合文档得字段中并没有可计算得数值

我们尝试添加一个集合字段并先赋值为空

db.Quotations.update({},{$set:{"forcevalue": ""}},{multi:true})

添加随机值

db.Quotations.update({"name":"黑藤"},{$set:{"forcevalue": Math.random*100}},{multi:true})db.Quotations.update({"name":"孙友福"},{$set:{"forcevalue": Math.random*100}},{multi:true})db.Quotations.update({"name":"濑川"},{$set:{"forcevalue": Math.random*100}},{multi:true})db.Quotations.update({"name":"黄金标"},{$set:{"forcevalue": Math.random*100}},{multi:true})db.Quotations.update({"name":"贾贵"},{$set:{"forcevalue": Math.random*100}},{multi:true})

结果如下

{ "name" : "黑藤", "description" : "天下汉奸一般蠢", "createDate" : "2021-04-16", "forcevalue" : 14.796604243632927 }{ "name" : "孙友福", "description" : "没有水就没有鱼,没有你就没有驴", "createDate" : "2021-04-17", "forcevalue" : 43.71427504449847 }{ "name" : "濑川", "description" : "去东关,捣乱得干活", "forcevalue" : 41.53502198761502 }{ "name" : "黄金标", "createDate" : "2021-04-26", "description" : "刘副官你记住了,让皇军先尿。", "forcevalue" : 21.887495918176125 }{ "name" : "贾贵", "createDate" : "2021-04-18", "description" : "我啐他一脸狗屎", "forcevalue" : 94.18697675337746 }

由于要用到分组,我们需要多添加几条文档数据

db.Quotations.insertMany([ {name: '黄金标',description: '我黄某人为官一任就得保一方平安',forcevalue:Math.random()*100,createDate: '2021-04-11'}, {name: '贾贵',description: '皇军没来得时候,你欺负我,皇军来了你还欺负我,那皇军不是TM白来了么',forcevalue:Math.random()*100,createDate: '2021-04-14'}, {name: '黑藤',description: '全东亚乃至全亚洲都找不到第二张想你这么一张基本没有了得脸来',forcevalue:Math.random()*100,createDate: '2021-04-22'}, {name: '贾贵',description: '这我哪知道啊,我就知道她长得嘿',forcevalue:Math.random()*100, createDate: '2021-04-19'} ])分组使用聚合函数

常用聚合函数

$sum

$avg

$max

$min

$first

$last

根据 name分组并使用$sum函数求和,得到一下结果

$match查询条件

$group根据字段分组(可以是多字段) + 聚合函数

> db.Quotations.aggregate(... {"$match":{"createDate":{"$gt":"2021-04-07"}}},... {"$group":{"_id":"$name",'forcevalue':{"$sum":"$forcevalue"}}},... ){ "_id" : "贾贵", "forcevalue" : 204.22774268609504 }{ "_id" : "黄金标", "forcevalue" : 121.14812944012357 }{ "_id" : "黑藤", "forcevalue" : 91.2583132098972 }{ "_id" : "孙友福", "forcevalue" : 43.71427504449847 }

这相当于在 Mysql中执行

select id,sum(forcevalue) from Quotations where createDate > "2021-04-07" group by name;

$avg求平均

> db.Quotations.aggregate(... {"$match":{"createDate":{"$gt":"2021-04-07"}}},... {"$group":{"_id":"$name",'forcevalue':{"$avg":"$forcevalue"}}},... ){ "_id" : "贾贵", "forcevalue" : 68.07591422869835 }{ "_id" : "黄金标", "forcevalue" : 60.574064720061784 }{ "_id" : "黑藤", "forcevalue" : 45.6291566049486 }{ "_id" : "孙友福", "forcevalue" : 43.71427504449847 }多字段分组

根据 createDate+name进行分组之后求和

> db.Quotations.aggregate(... ... {"$match":{"createDate":{"$gt":"2021-04-07"}}},... ... {"$group":{"_id":{"createDate":"$createDate","name":"$name"},'forcevalue':{"$sum":"$forcevalue"}}},... ... ){ "_id" : { "createDate" : "2021-04-11", "name" : "黄金标" }, "forcevalue" : 99.26063352194744 }{ "_id" : { "createDate" : "2021-04-16", "name" : "黑藤" }, "forcevalue" : 14.796604243632927 }{ "_id" : { "createDate" : "2021-04-17", "name" : "孙友福" }, "forcevalue" : 43.71427504449847 }{ "_id" : { "createDate" : "2021-04-18", "name" : "贾贵" }, "forcevalue" : 94.18697675337746 }{ "_id" : { "createDate" : "2021-04-26", "name" : "黄金标" }, "forcevalue" : 21.887495918176125 }{ "_id" : { "createDate" : "2021-04-14", "name" : "贾贵" }, "forcevalue" : 81.9931941785778 }{ "_id" : { "createDate" : "2021-04-22", "name" : "黑藤" }, "forcevalue" : 76.46170896626427 }{ "_id" : { "createDate" : "2021-04-19", "name" : "贾贵" }, "forcevalue" : 28.04757175413979 }

 
(文/郭昊宇)
免责声明
• 
本文仅代表发布者:郭昊宇个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,需自行承担相应责任。涉及到版权或其他问题,请及时联系我们删除处理邮件:weilaitui@qq.com。
 

Copyright©2015-2025 粤公网安备 44030702000869号

粤ICP备16078936号

微信

关注
微信

微信二维码

WAP二维码

客服

联系
客服

联系客服:

24在线QQ: 770665880

客服电话: 020-82301567

E_mail邮箱: weilaitui@qq.com

微信公众号: weishitui

韩瑞 小英 张泽

工作时间:

周一至周五: 08:00 - 24:00

反馈

用户
反馈