Python 数据持久化 - PyMongo 模块

MongoDB 是一个面向文档的 NoSQL 数据库。 它是一个跨平台的数据库,在服务器端公共许可下分发。 它使用类似 JSON 的文档作为模式。

为了提供存储海量数据的能力,多个物理服务器(称为分片)相互连接,从而实现横向扩展。 MongoDB 数据库由文件组成。

MongoDB

文档类似于关系数据库表中的一行。 但是,它没有特定的模式。 文档是键值对的集合——类似于字典。 但是,每个文档中的 k-v 对数量可能会有所不同。正如关系数据库中的表有一个主键一样,MongoDB 数据库中的文档有一个名为 "_id" 的特殊键。

在我们了解 MongoDB 数据库如何与 Python 一起使用之前,让我们简要了解一下如何安装和启动 MongoDB。 提供 MongoDB 的社区版和商业版。 社区版可以从www.mongodb.com/download-center/community 下载。

假设 MongoDB 安装在 c:\mongodb 中,可以使用以下命令调用服务器。

c:\mongodb\bin>mongod

MongoDB 服务器默认在端口号 22017 上处于活动状态。 数据库默认存储在 data/bin 文件夹中,但可以通过 –dbpath 选项更改位置。

MongoDB 在 MongoDB shell 中有自己的一组命令。 要调用 shell,请使用 Mongo 命令。

x:\mongodb\bin>mongo

出现类似于 MySQL 或 SQLite shell 提示的 shell 提示,在此之前可以执行本机 NoSQL 命令。 但是,我们对将 MongoDB 数据库连接到 Python 更感兴趣。

PyMongo 模块由 MongoDB 公司自行开发,提供 Python 编程接口。 使用著名的 pip 实用程序安装 PyMongo。

pip3 install pymongo

假设 MongoDB 服务器已启动并正在运行(使用 mongod 命令)并正在侦听端口 22017,我们首先需要声明一个 MongoClient 对象。 它控制 Python 会话和数据库之间的所有事务。

from pymongo import MongoClient
client=MongoClient()

使用此客户端对象与 MongoDB 服务器建立连接。

client = MongoClient('localhost', 27017)

使用以下命令创建一个新数据库。

db=client.newdb

MongoDB 数据库可以有很多集合,类似于关系数据库中的表。 Collection 对象由 Create_collection() 函数创建。

db.create_collection('students')

现在,我们可以在集合中添加一个或多个文档,如下所示 −

from pymongo import MongoClient
client=MongoClient()
db=client.newdb
db.create_collection("students")
student=db['students']
studentlist=[{'studentID':1,'Name':'Juhi','age':20, 'marks'=100},
{'studentID':2,'Name':'dilip','age':20, 'marks'=110},
{'studentID':3,'Name':'jeevan','age':24, 'marks'=145}]
student.insert_many(studentlist)
client.close()

要检索文档(类似于 SELECT 查询),我们应该使用 find() 方法。 它返回一个游标,借助该游标可以获得所有文档。

students=db['students']
docs=students.find()
for doc in docs:
   print (doc['Name'], doc['age'], doc['marks'] )

要查找特定文档而不是集合中的所有文档,我们需要将过滤器应用于 find() 方法。 过滤器使用逻辑运算符。 MongoDB 有自己的一组逻辑运算符,如下所示 −

Sr.No MongoDB 运算符 & 传统逻辑运算符
1

$eq

等于(==)

2

$gt

大于 (>)

3

$gte

大于或等于 (>=)

4

$in

如果等于数组中的任何值

5

$lt

小于 (<)

6

$lte

小于等于 (<=)

7

$ne

不等于 (!=)

8

$nin

如果不等于数组中的任何值

例如,我们有兴趣获取 21 岁以上学生的列表。 在 find() 方法的过滤器中使用 $gt 运算符,如下所示 −

students=db['students']
docs=students.find({'age':{'$gt':21}})
for doc in docs:
   print (doc.get('Name'), doc.get('age'), doc.get('marks'))

PyMongo 模块提供了update_one()update_many() 方法来修改一个或多个满足特定过滤器表达式的文档。

让我们更新 name 为 Juhi 的文档的 marks 属性。

from pymongo import MongoClient
client=MongoClient()
db=client.newdb
doc=db.students.find_one({'Name': 'Juhi'})
db['students'].update_one({'Name': 'Juhi'},{"$set":{'marks':150}})
client.close()