点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

夜阑卧听风吹雨,铁马冰河入梦来。

Hello,大家好。我是吴老板。

前言

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

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

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

参考资料:

https://www.runoob.com/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 dbs
admin   0.000GB
config  0.000GB
local   0.000GB

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

尝试创建集合 Quotations

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

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

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

> show collections
Quotations

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

删除一个数据库

> 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}).pretty()

AND 查询

查询 [ 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" : "刘副官你记住了,让皇军先尿。" }

发现也是可以的 !!

ANDOR 联合使用

查询 [ 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 }

???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ????

我不能再继续写下去了,MongoDB 的基础入门就介绍到这里 ????

更多教程请参考 MongoDB官方文档

结束语

我是吴老板,以上就是我们这次的干货分享了。最后重申下:

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

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

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

如果文章内容有出错的地方,希望大伙批评指正。下回见!

------------------- End -------------------

往期精彩文章推荐:

  • 手把手教你使用Python轻松打造淘宝主图视频生成神器

  • 手把手教你使用XPath爬取免费代理IP

  • 盘点Python网页开发轻量级框架Flask知识(下篇)

  • 盘点Python网页开发轻量级框架Flask知识(上篇)

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

干货文——一文带你搞懂爬虫储存数据库MongoDB相关推荐

  1. dbcp连接池配置详解_重学MySQL:事务与连接池,一文详解带你搞懂

    拼多多三面惨败,java中间件.数据库与spring框架,答不上... 吊打MySQL:21性能优化实践+学习导图+55面试+笔记+20高频知识点 Mysql事务 事务: 事务指逻辑上的一组操作,组成 ...

  2. 一文带你搞懂从动态代理实现到Spring AOP

    摘要:本文主要讲了Spring Aop动态代理实现的两种方式. 1. Spring AOP Spring是一个轻型容器,Spring整个系列的最最核心的概念当属IoC.AOP.可见AOP是Spring ...

  3. 一文带你搞懂C#多线程的5种写法

    一文带你搞懂C#多线程的5种写法 1.简介 超长警告! 在学习本篇文章前你需要学习的相关知识: 线程基本知识 此篇文章简单总结了C#中主要的多线程实现方法,包括: Thread 线程 ThreadPo ...

  4. RPC框架:一文带你搞懂RPC

    RPC是什么(GPT答) ChatGPT回答: RPC(Remote Procedure Call)是一种分布式应用程序的编程模型,允许程序在不同的计算机上运行.它以一种透明的方式,将一个程序的函数调 ...

  5. 如何查询你电脑的IP地址?一文带你搞懂IP地址

    上一章介绍了数据链路层--以太网数据帧的报文格式(你知道以太网数据帧在网络中如何发送和接收的吗?一文带你搞懂它),本章介绍下网络层--IP地址. 大家都知道计算机都会有一个IP地址,只有配置了IP地址 ...

  6. RPC框架:从原理到选型,一文带你搞懂RPC

    大家好,我是华仔,RPC系列的文章是我去年写的,当时写的比较散,现在重新进行整理.对于想学习RPC框架的同学,通过这篇文章,让你知其然并知其所以然,便于以后技术选型,下面是文章内容目录: RPC 什么 ...

  7. 【回炉重造】带你搞懂什么是机器学习?

    带你搞懂什么是机器学习? 机器学习介绍 什么是机器学习: 机器学习应用案例: 机器学习程序开发流程: 1. 获取数据: 2. 清洗数据: 3. 训练模型: 4. 测试模型: 5. 投入使用: 开发环境 ...

  8. 学习最新大厂付费视频时整理的万字长文+配图带你搞懂 MySQL

    万字长文+配图带你搞懂 MySQL MySQL SQL的介绍 SQL分类 MySQL语法 创建数据库 修改.删除.使用数据库 DDL查询数据表 DDL创建数据表 修改数据表结构 删除数据表 DML添加 ...

  9. 五分钟学会python函数_五分钟带你搞懂python 迭代器与生成器

    前言 大家周末好,今天给大家带来的是Python当中生成器和迭代器的使用. 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉得这是一种新的获取数据的方法.对于获取数据的方法而言,我们会一种就 ...

最新文章

  1. [转载]如何发送和接收 Windows Phone 的 Toast 通知
  2. 【深度学习】数形结合的图像处理(文末介绍了一种新型网络)
  3. 幻灯片:Why Java Sucks and C# Rocks
  4. Slack:日活跃用户50万人、6周增幅35%造就奇迹
  5. stacktraces_Stacktraces告诉了事实。 但事实并非如此。
  6. ios wkweb设置图片_iOS WKWebView的使用
  7. 解决:Chrome 插件安装时提示 程序包无效:“CRX_HEADER_INVALID“
  8. 疯狂java学习笔记1023---线程的同步
  9. mysql中select 的题型_MYSQL经典题型详情解析
  10. 中国联通董事李福申辞任
  11. Java工程师历年企业笔试真题汇总
  12. 用github创建php网站,github可以用来做什么
  13. Beyond Part Models: Person Retrieval with Refined Part Pooling (and A Strong Convolutional Baseline)
  14. HDOJ 3537 Daizhenyang's Coin (翻硬币游戏)
  15. 【数据库】--- Redis
  16. PAT a1139
  17. ttlink无线打印服务器,TTLINK TT-180U1打印机服务器 TCP/IP添加打印机的教程
  18. 从0到1玩转戴尔G7 7588 macOS Win 双系统
  19. 在家远程控制公司电脑怎么实现 7款好用的远程工具介绍
  20. 奥比中光Femto相机环境配置

热门文章

  1. linux虚拟机的CentOS 7版本root用户和普通用户的密码破解过程
  2. 程序员中年危机:半路出家Java程序员看我轻松逆袭
  3. 冯诺依曼计算机的运行原理
  4. bootstrap网格系统回顾
  5. Navicat将表生成pdm文件
  6. uni-app 实现定点签到功能
  7. Ingress 资源与 networking.k8s.io/v1 问题
  8. 郭昌洪畅谈—物业管理工作三大论述
  9. C# 四舍五入 MidpointRounding.AwayFromZero
  10. Oracle导出数据字典