Python工具箱系列(二十九)
MongoDB号称文档数据库,是目前发展迅速的NoSQL数据库。它由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
主要功能特性有:
◆面向集合存储,易存储对象类型的数据。
◆模式自由。
◆支持动态查询。
◆支持完全索引,包含内部对象。
◆支持查询。
◆支持复制和故障恢复。
◆使用高效的二进制数据存储,包括大型对象(如视频等)。
◆自动处理碎片,以支持云计算层次的扩展性。
◆支持Golang,RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
◆文件存储格式为BSON(一种JSON的扩展)。
◆可通过网络访问。
其主要场景如下:
◆实时数据处理。它非常适合实时的插入、更新与查询,并具备实时数据存储所需的复制及高度伸缩性。
◆缓存。由于性能很高,它适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久化缓存层可以避免下层的数据源过载。
◆高伸缩性的场景。非常适合由数十或数百台服务器组成的数据库,已经包含了对MapReduce引擎的内置支持。
不适用的场景如下:
◆要求高度事务性的系统。
◆传统的商业智能应用。
◆复杂的跨文档(表)级联查询。
MongoDB服务端可运行在Linux、Windows或mac os x平台,支持32位和64位应用,默认端口为27017。推荐运行在64位非Windows平台上。笔者最喜欢的特性之一就是MongoDB具备的灵活的分片机制,配置好的分片机制不仅能够达到负载均衡的目标,而且还能够冗余备份。
一、Ubuntu bionic下安装
直接使用官网提供的deb文件安装即可。
# server wget https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/4.4/multiverse/binary-arm64/mongodb-org-server_4.4.15_arm64.deb # mongos,分片服务器 wget https://repo.mongodb.org/apt/ubuntu/dists/bionic/mongodb-org/4.4/multiverse/binary-amd64/mongodb-org-mongos_4.4.15_amd64.deb # setup server dpkg -i mongodb-org-server_5.0.9_amd64.deb # 检查相关状态 systemctl status mongod # 自动启动 systemctl enable mongod # 使用命令行操作mongodb mongo
对配置文件/etc/mongod.conf进行修改,以获得远程访问的能力。
cat /etc/mongod.conf |grep bind sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mongod.conf cat /etc/mongod.conf |grep bind systemctl restart mongod systemctl status mongod
MongoDB提供了丰富的命令,专家可以全面操控数据库以及数据,但对于初学者不太友好。为此推荐使用MongoDB官方提供的MongoDBCompass,在windows下载安装即可,随后连接远程MongoDB数据库,使用效果如下图所示:
从图中可以看出,服务器在远程,并且通过这个GUI界面,也能够输入命令来操作MongoDB数据库。
二、Python连接使用MongoDB
用Python操作MongoDB非常方便,无需定义表结构就可以直接将数据插入,使用pymongo模块,可以实现MongoDB与Python的交互。安装命令如下:
pip install pymongo
下述代码示例了创建/使用定制的数据库,并且插入三条记录,并且查询的过程。
import pymongo client = pymongo.MongoClient("mongodb://192.168.0.66:27017") print(client.list_database_names()) db = client['raindrop'] collection = db['pm25'] # 增加一条 stu1 = {'id': '001', 'area': 'office', 'pm25': 8} result = collection.insert_one(stu1) # 增加多条 stu2 = {'id': '002', 'area': 'field01', 'pm25': 15, "temp": 10.5} stu3 = {'id': '003', 'monitor': 'wangwu', 'area': 'field02', 'age': 20} result = collection.insert_many([stu2, stu3]) # 查询记录 ret = collection.find_one({'area': 'office'}) print(ret)
通过MongoDB Compass可以看到数据库保存了三个文档。
由于MongoDB无模式特点,使用起来非常方便,尤其对于半结构化的数据存储特别有利。