关于Mongodb的使用,在我的Python全栈学习笔记专栏网络爬虫篇已经介绍过了,这边的话继续完整的整合下,增加新的知识点内容。

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

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

MongoDB服务端可运行在Linux、Windows或mac os x平台,支持32位和64位应用,默认端口为27017。

推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

MongoDB 主要特点

  • MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。
  • 集合就是一组文档,类似于关系数据库中的表。

既然集合中可以存放任何类型的文档,那么为什么还需要使用多个集合?

这是因为所有文档都放在同一个集合中,无论对于开发者还是管理员,都很难对集合进行管理,而且这种情形下,对集合的查询等操作效率都不高。所以在实际使用中,往往将文档分类存放在不同的集合中。

MongoDB 实例可以承载多个数据库。它们之间可以看作相互独立,每个数据库都有独立的权限控制。在磁盘上,不同的数据库存放在不同的文件中。

MongoDB 中存在以下系统数据库:

  • Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。

  • Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。

  • Config 数据库:当MongoDB使用分片模式时,config 数据库在内部使用,用于保存分片的信息。

用户权限介绍
在这里插入图片描述

3.1 Mongodb远程连接

想要进行远程的连接操作,首先要创建Mongodb的用户,展示如下所示:

创建用户

cd /www/server/mongodb/bin 
# mongo安装目录下的bin目录

mongo
# 启动mongo服务,输入命令行mongo,进入mongodb环境

use admin
# 切换到admin数据库
# 正常情况就会报错 Error: not authorized on admin
# 先鉴权登录 db.auth('root', '此处是密码')

db.createUser({user: "root",pwd:"root",roles:[{ role: "readWriteAnyDatabase" , db: "DBNAME" }] })
# 创建用户
db.createUser({user:"root",pwd:"123456",roles:["root"] })  # 第二种方式

# 成功结果如下:
Successfully added user: {
        "user" : "root",
        "roles" : [
                {
                        "role" : "readWriteAnyDatabase",
                        "db" : "admin"
                }
        ]
}

show users
# 查看用户列表

远程联机宝塔centos系统的Mongodb数据库

进行权限的配置修改:

宝塔面板 和 服务器平台 都要开启27017的端口号
在这里插入图片描述
Mongodb结合Flask框架制作接口:

import pymongo
from flask import Flask, make_response
from bson import json_util

app = Flask(__name__)
app.MongoClient = pymongo.mongo_client.MongoClient("mongodb://root:root@服务器IP:27017")


@app.route("/login")
def index():
    db = app.MongoClient["campus"]
    # 选择数据库库
    collection = db.login
    # 选择集合
    data = collection.find()
    # 查询数据
    data_res = []
    for item in data:
        data_res.append(item)
    res = make_response(json_util.dumps(data_res))
    res.status = 200
    res.headers['Content-Type'] = "application/json"
    return res

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8080, debug=True)

Object of type ‘ObjectId’ is not JSON serializable 报错

从 mongo 中直接将查到的数据 dumps 导出,报错:

Object of type 'ObjectId' is not JSON serializable

解决方法:

from bson import json_util
 
json_util.dumps(data)

修改Mongodb用户的密码

db.changeUserPassword("root","mongodbadmin");

3.2 调用pymongo第三方库

PyMongo是驱动程序,使python程序能够使用Mongodb数据库,使用python编写而成。

先去官网下载软件包,地址点击打开链接,解压缩后进入,使用python setup.py install 进行安装或者用pip安装pip -m install pymongo
在这里插入图片描述
然后我们点击进入查看MongodbClient的源码:实例可以表示独立的MongoDB服务器、复制集或锐化集群。此类的实例负责维护集群的最新状态,并可能维护与此相关的缓存资源,包括用于监视的后台线程和连接池。(爱词霸翻译)
在这里插入图片描述
远程连接宝塔面板的Mongodb

import pymongo
from datetime import datetime

print(datetime.now())
# username="test"
# password="test"
# connection=pymongo.mongo_client.MongoClient(host="192.168.10.9:27017,connect=False,username=username,password=password)

# 链接服务器, 是本地服务器可不需要传入参数
MongoClient = pymongo.mongo_client.MongoClient("mongodb://root:root@远程服务器IP:27017")
# MongoClient = pymongo.MongoClient("mongodb://root:root@远程服务器IP:27017")


# 获取数据库, 中括号中填入数据库中的名字
db = MongoClient["wrist"]


collection = db.zhangyan

res = collection.find()

for item in res:
    print(item.get("name"))

3.3 pymongo插入数据

pymongo是Python中用来操作MongoDB的一个库,MongoDB是一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。

其文件存储格式类似于JSON,叫BSON,通俗的理解,就是Python中的字典键值对格式,所以查询也需要根据键值对来。

特别注意:其文件存储格式只是类似于JSON,不是JSON,另外读出的数据不需要使用bson库进行转成对象,因为pymongo底层帮助我们转换成对象了。

只是在网络传输的过程中,需要传化成json字符串,那么需要我们要安装bson第三方库:pip install bson,来使特殊的dict对象进行转换成json字符串。

在Document中插入数据:

collection.insert_one({'name': '唤醒手腕', 'datetime': datetime.now()})

insert_many(list_of_dict) # 插入多个

3.4 pymongo查询数据(重要)

比较运算符 查找数据

符号说明
$eq它将匹配等于指定值的值
$ne它将匹配所有不等于指定值的值
$gt它将匹配大于指定值的值
$gte它将匹配所有大于或等于指定值的值
$lt它将匹配所有小于指定值的值
$lte它将匹配所有小于或等于指定值的值
$in它将匹配数组中指定的任何值
$nin它讲匹配不再数组中的值
比较运算符 查找数据,代码如下:
filterOption = {
    "age": {"$gte": 20}
}
# 查询年龄大于等于20岁的
data = collection.find_one(filterOption)
print(data)
# {'_id': ObjectId('61c7297dfff4db0a50af9f06'), 'name': '张燕', 'age': 20}

逻辑运算符查询
在这里插入图片描述

filterAnd = {
	'$and':[
		{'fid': {'$eq': 2048}}, # filter_01
		{'sid': {'$ne': 1024}}  # filter_02
		]
}

filterOr = {
	'$or':[
		{'fid': {'$eq': 2048}}, # filter_01
		{'sid': {'$ne': 1024}}  # filter_02
		]	
}

正则表达式查询

filterOption = {
	'name': {'$regex': r'Tom [a-zA-Z]+'}
}

遍历文档获取集合内所有文件:

# collection.find({})
# collection.find_one(filter) 只返回1个

for one in collection.find({}):
	print(one)

3.5 pymongo删除数据

删除的操作:

删除一个 collection.delete_one(filter)

删除多个 collection.delete_many(filter)

3.6 pymongo修改数据

修改的操作:

collection.update_many(filter, update)

新参量 update 说明:形式 {command: {key: value}}

  • $set 修改或新增字段
  • $unset 删除指定字段
  • $rename 重命名字段
# 修改或新增字段
filter = {'name': '马大师'}
add_data = {'age': 60}

# key name 存在,改其值为 马大师?
update1 = {'$set': {'name': '马大师?'}}

# key age 不存在,插入字段
update2 = {'$set': add_data}

collection.update_one(filter, update1)
collection.update_one(filter, update2)

# 删除指定字段
filter = {'name': '马大师?'}
del_data = {'age': 60}

update = {'$unset': del_data}

collection.update_one(filter, update)

# 重命名字段
filter = {'name': '马大师?'}
update = {'$rename': {'name': '名字'}}
collection.update_one(filter, update)

断开连接:

client.close()

3.7 pymongo结合爬虫案例

import requests
import json
import pymongo

headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
data = requests.get("http://localhost:8080/person/words/all", headers=headers)
words = json.loads(data.text)

MongoClient = pymongo.mongo_client.MongoClient("mongodb://root:root@远程服务器IP:27017")
db = MongoClient['wrist']
collection = db.word
collection.insert_many(words)

pymongo客户端展示如下:
在这里插入图片描述

3.8 mongodump 备份工具

mongodump 能够在 Mongodb 运行时进行备份,它的工作原理是对运行的 Mongodb 做查询,然后将所有查到的文档写入磁盘。

mongodump的参数与mongoexport的参数基本一致。

mongodump关键参数如下所示:

mongodump --help 查看帮助命令
参数解释
-h, --host代表远程连接的数据库地址,默认连接本地Mongo数据库;
–port代表远程连接的数据库的端口,默认连接的远程端口27017;
-u, --username代表连接远程数据库的账号,如果设置数据库的认证,需要指定用户账号;
-p, --password代表连接数据库的账号对应的密码;
-d, --db代表连接的数据库;
-c, --collection代表连接数据库中的集合;
-o, --out代表导出的文件输出目录;
-q, --query代表查询条件;
-j, --numParallelCollections要并行转储的集合数(默认为4)
–gzip使用Gzip压缩存档;
–oplog使用oplog进行时间点快照;
–authenticationDatabase指定用户鉴定库;

全库备份

mongodump -u -p --port 27017 --authenticationDatabase admin -o /tmp/backup

备份指定的库,test库

mongodump -u -p --port 27017 --authenticationDatabase admin -d test -o /tmp/backup

备份test库下的customer集合

mongodump -u -p --port 27017 --authenticationDatabase admin -d test -c customer -o /tmp/backup

压缩备份单库

mongodump -u -p --port 27017 --authenticationDatabase admin -d test -o /tmp/backup --gzip

压缩备份单表

mongodump -u -p --port 27017 --authenticationDatabase admin -d test -c customer -o /tmp/backup --gzip

单库恢复

mongorestore -u -p --port 27017 --authenticationDatabase admin -d test /tmp/backup/test

恢复test库下的customer集合

mongorestore -u -p --port 27017 --authenticationDatabase admin -d test -c customer /tmp/backup/test/customer.bson

注意点:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,备份后添加修改的数据都会被删除,谨慎使用!

恢复单库

mongorestore -u -p --port 28018 --authenticationDatabase admin -d test --drop /tmp/backup/test

恢复单表

mongorestore -u -p --port 28018 --authenticationDatabase admin -d test -c customer --drop /tmp/backup/test/customer.bson
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐