Python数据持久性 PyMongo模块
MongoDB是一个面向文档的 NoSQL 数据库。它是一个跨平台的数据库,在服务器端公共许可下发布。它使用类似JSON的文件作为模式。
为了提供存储巨大数据的能力,多个物理服务器(称为分片)被相互连接,从而实现了横向扩展。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提示符出现在面前,可以执行本地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数据库可以有许多集合,类似于关系型数据库中的表。一个集合对象是由 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有自己的一套逻辑运算符,如下所示
序号 | 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() 方法,用于修改一个或多个满足特定过滤表达的文档。
让我们更新一个名字为Juhi的文档的标记属性。
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()