python读取mongodb数据,python连接mongodb数据库
MongoDB是一个用C语言编写的非关系数据库,是一个基于分布式文件存储的开源数据库系统。其内容存储形式类似于JSON对象。下面文章主要介绍使用Python操作MongoDB数据库的相关信息。有需要的可以参考一下。
00-1010前言1连接数据库1.1安装PyMongo1.2连接数据库1.3连接库和集合2 Python中MongoDB命令的对应方法3向MongoDB中插入数据插入数据格式的基本语法说明示例4从MongoDB中查询数据一个数据查询集合逻辑地查询所有数据并对结果进行计数并对结果进行字段去重。5更新/删除MongoDB中数据的基本语法。更新数据的示例。6个MongoDB和Python不常见的操作。6.1空值。6.2布尔值。6.3排序参数。6.4查询_id摘要摘要
目录
通常,在一个项目中,需要一种编程语言来操作数据库。用Python来操作数据库有着天然的优势,因为Python的字典和MongoDB的文档几乎是同一个格式。本文介绍如何使用Python操作MongoDB。
前言
1 连接数据库
使用Python操作MongoDB需要使用第三方库——PyMongo。这个安装库与Python中的其他第三方库相同。您可以使用pip安装它:
python3 -m pip安装pymongo
您也可以指定安装的版本:
python3 -m pip3安装pymongo==3.5.1
更新pymongo命令:
python3 -m pip3安装-升级pymongo
安装完成后,打开Python交互环境,导入PyMongo。如果没有报告错误(如图所示),则安装成功。
1.1 安装PyMongo
要使用PyMongo操作MongoDB,首先需要初始化数据库连接。
(1)如果在本地计算机上运行MongoDB,并且没有修改端口或者添加用户名和密码,那么MongoClient的实例初始化不需要参数,直接写成以下格式:
导入pymongo
conn=pymongo。MongoClient()
(2)如果MongoDB运行在其他服务器上,需要使用“URI(UniformResource Identifier)”来指定链接地址。
导入pymongo
conn=pymongo。MongoClient( MongoDB ://test :12345 @ 45 . 10 . 19 )
MongoDB的URI格式如下:MongoDB :///用户名:密码@服务器IP或域名:端口例如:
(3)如果没有设置权限验证,则不需要用户名和密码,可以写成
导入pymongo
精读
n = pymongo.MongoClient(mongodb://45.10.110.77:27019)
1.3 连接库与集合
PyMongo连接库与集合有两种方式
- 方式1
连接数据库与集合的方法1
from pymongo import MongoClientconn = MongoClient()
databae = conn.数据库名
collection = database.集合名
需要注意,在使用这种方式时,代码中的数据库名和集合名都不是变量名,它们直接就是库的名字和集合的名字。例如,要连接上example_data_1所在的集合,则Python代码如下:
from pymongo import MongoClientconn = MongoClient()
database = conn.chapter_1
collection = database.example_data_1
- 方式2
连接数据库与集合方法2
from pymongo import MongoClientdb_name = chapter_1
collection_name = example_data_1
conn = MongoClient()
database = conn[db_name]
collection = database[collection_name]
在使用这种方式时,在方括号中可以直接填变量来指定库名和集合名。当然,也可以直接填字符串,例如:
from pymongo import MongoClientconn = MongoClient()
database = conn[chapter_1]
collection = database[example_data_1]
方式1 和方式2效果是完全相同的。大家可以任意选择一种自己喜欢的方式。
方式2主要用在需要批量操作数据库的情况下。例如在项目中,有时有多个测试环境,现在需要同时更新这些环境对应的数据库,则可以使用方式2。因为,这样可以将多个数据库的名字或者是多个集合的名字保存在列表中,然后再使用循环来进行操作,如下所示:
database_name_list = [develop_env_alpha,develop_env_beta,develop_env_preflight]for each_db in database_name_list:
database = conn[each_db]
collection = database.account
collection.updateMany(.....)
其中第3行代码,在循环里面每次连接不同的库,这样写可以同时更新多个数据库的信息,对于同一个数据库里面的多个集合,也可以使用这个方法来操作。
注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
2 MongoDB命令在Python中的对应方法
在获取到集合连接对象collection后,就可以用这个对象的各个方法来操作MongoDB了。
虽然 MongoDB 的命令和 collection 的方法名在写法上有微小的差异,但绝大多数的MongoDB语句的参数直接复制到Python代码中都可以使用。
MongoDB的命令使用的是驼峰命名法,而PyMongo使用的是小写字母加下划线的方式。它们的对比见下表:
MongoDB命令 PyMongo方法
例如,Robo 3T执行的批量插入语句:
db.getCollection(example_data_1).insertMany([{name: 赵小三,age:20,address:北京},
{name: 钱小四,age:21,address:上海},
{name: 孙小五,age:20,address:山东},
{name: 李小六,age:23,address:河北},
{name: 欧阳小七,age:24,address:杭州}
])
使用Python批量插入数据,代码如下:
from pymongo import MongoClientconn = MongoClient()
database = conn.chapter_1
collection = database.example_data_2
collection.insert_many([
{name: 王小二,age:21,student:True,address:广州},
{name: 赵小三,age:20,student:True,address:北京},
{name: 钱小四,age:21,student:True,address:上海},
{name: 孙小五,age:20,student:True,address:山东},
{name: 李小六,age: None,student:True,address:河北},
{name: 欧阳小七,age:24,student:False,address:杭州},
{name: 公孙小八,age:25,student:False,address:广州}
])
其中,第4行代码中使用了新的集合名字,用以区别。
使用Python操作MongoDB还有一个好处:如果当前使用的库或者集合不存在,则在调用了插入方法以后,PyMongo会自动创建对应的库或集合。
总之,绝大部分的操作,直接从Robo 3T中复制到Python中都可以运行,几乎不需要修改。
3 插入数据到MongoDB
基本语法
collection.insert_one(字典) # 插入一条数据collection.insert_many(包含字典的列表) # 批量插入多条数据
被插入的数据格式
{field_1: value_1, field_2: value_2}[
{field_1: value_1, field_2: value_2},
{field_1: value_3, field_2: value_4}
]
说明
- MongoDB不需要提前创建数据库、不需要提前创建集合、不需要提取定义数据格式,想插入什么数据,直接插就行。
- 同一个集合的不同行数据,字典可以不一
举例
在Python中,将字典{‘name’: ’王小六’, ‘age’: 25, ‘work’: ’厨师’}插入到MongoDB中。
具体命令如下:
collection.insert_one({name: 王小六, age: 25, work: 厨师})
提示:PyMongo还有一个通用方法——collection.insert()。
- 如果传入的是一个字典,则collection.insert()相当于insert_one
- 如果传入的是一个包含字典的集合,则collection.insert()相当于insert_many
但是PyMongo开发者准备移除它,因此不推荐读者在正式环境中使用这个方法。
4 从MongoDB中查询数据
查询一条数据
我们可以使用 find_one() 方法来查询集合中的一条数据,查询example_data_2 文档中的第一条数据:
from pymongo import MongoClientdb_name = chapter_1
collection_name = example_data_1
conn = MongoClient()
database = conn[db_name]
collection = database[collection_name]
x=collection.find_one({})
print(x)
输出结果:
查询集合中所有数据
from pymongo import MongoClientdb_name = chapter_1
collection_name = example_data_1
conn = MongoClient()
database = conn[db_name]
collection = database[collection_name]
collection = database.example_data_2
rows = collection.find()
for row in rows:
print(row)
结果如下:
逻辑查询
collection.find({字段名: {基本符号: 边界值, 基本符号: 边界值}})
在Python中,从MongoDB中查询所有age大于21小于25,并且name不等于夏侯小七的记录。
collection = database.example_data_2rows = collection.find({age:{$lt:25,$gt:21},
name:{$ne:公孙小八}})
for row in rows:
print(row)
运行效果如图所示:
查询并对结果进行计数
collection.find().count()
查询并对结果进行计数
# 在Python中collection.find().sort(字段名, 方向)
# 在Robo 3T的命令输入区域
collection.find().sort({字段名: 方向})
其中方向为1表示升序,方向为**-1**表示降序
对字段去重
# 对字段去重handler.distinct(字段名)
# 先筛选再去重
handler.distinct(字段名, 查询条件)
注意:如果字段的数量很大,那么轻易不要在Robo 3T里面直接执行,否则可能导致Robo 3T卡死
5 更新/删除MongoDB中的数据
基本语法
# 更新一条数据collection.update_one(查询条件, {$set: 被更新的数据})
# 更新所有满足要求的数据
collection.update_many(查询条件, {$set: 被更新的数据})
被更新的数据
{field_1: value_1, field_2: value_2}
举例
在Python中更新数据和删除数据:
(1)对于name为公孙小八的记录,将age更新为80,将address更新为美国。
(2)删除age为0的数据
1.更新MongoDB中的数据
在Python中,可以使用udate_many方法来批量更新数据
collection.update_many({name: 公孙小八},
{$set: {address: 英国,age:80}})
更新操作还支持一个upsert参数。该参数的作用是:如果数据存在,则更新;如果数据不存在,则创建。
例如,对于name为隐身人的记录,将age改为0,将address改为里世界
由于example_data_1中没有这一条记录,因此直接更新会报错,如图所示。
result = collection.update_one({name:隐身人},{$set:{name:隐身人,
age: 0,
address:里世界}})
print(list(result))
加上upsert参数,看看效果
result = collection.update_one({name:隐身人},{$set:{name:隐身人,
age: 0,
address:里世界}},
upsert = True)
print(result)
提示:如果打开了更新或插入功能,则$set的值是完整的文档内容,应该包含每一个字段,而不仅仅是需要被更新的字段,否则被插入的内容只有被更新的这几个字段。
2.删除MongoDB中的数据 基本语法
# 删除第一个满足条件的数据collection.delete_one(查询条件)
# 删除所有满足条件的数据
collection.delete_many(查询条件)
删除age为0的数据。删除语句如下:
collection.delete_many({age: 0})
建议先写查询语句,确认查询出来的数据就是自己想删除的数据,然后把关键字find改为delete_one或者delete_many
6 MongoDB与Python不通用的操作
绝大部分情况下,MongoDB中的命令参数直接复制到Python中就可以使用,但有一些情况例外。假设数据集example_data_2如图所示:
6.1 空值
在MongoDB中,空值写作null,在Python中,空值写作None。
MongoDB不认识None,Python不认识null。
为了从数据集example_data_2中查询出所有age字段为空的数据,在Robo 3T中的查询语句为:
db.getCollection(example_data_2).find({age: null})
运行结果如图所示:
如果直接把这段查询语句中的参数搬到Python中运行,则会导致报错,如图所示:
Python会把null当作一个普通的变量,但是这个变量又没有定义,所以导致报错。
在 Python 中,要查询空值需要使用 None,对上述代码做一些修改——把null改为None,则查询成功,如图所示:
6.2 布尔值
布尔值就是真和假两个值。在MongoDB中,真为true,假为false,首字母小写;在Python中,真为True,假为False,首字母大写。
在MongoDB中,查询所有student为true的记录,如图所示:
如果把这段查询语句的参数直接复制到 Python 中,同样也会导致报错,因为 Python 会把true当作一个普通的变量,如图所示:
把true改为True,则查询成功,如图所示:
6.3 排序参数
对查询到的结果进行排序是一个常见操作,在MongoDB中,sort()命令接收一个参数,这个参数是一个字典,Key是被排序的字段名,值为1或者−1。
对于数据集example_data_2,在Robo 3T中对age字段进行倒序排列,如图所示:
但在Python中,查询结果的sort()方法如果使用MongoDB的写法则会报错,如图所示:
在Python中,sort()方法接收两个参数:第1个参数为字段名,第2个参数为-1或者1。就能够正常运行,如图所示:
6.4 查询_id
在Robo 3T中,可以根据_id的值来查询文档。此时查询语句如下:
在安装PyMongo的同时,Python会自动安装一个叫作bson的第三方库。ObjectId这个类需要从bson库中导入,具体命令如下:
from bson import ObjectIdcollection.find({_id: ObjectId(5e8ac5dfdd9cf99b7a446e99)})
运行结果如下:
小结
本文首先介绍了MongoDB的安装,然后介绍了MongoDB的图形化操作软件Robo 3T。通过Robo 3T的命令输入窗口输入命令,可实现对MongoDB数据库的增、删、改、查操作。
MongoDB的大部分操作都可以平滑移植到Python中。因此,大多数情况下,直接把Robo 3T中的MongoDB操作语句复制到Python中就能使用。当然,有很小一部分情况例外。
总结
到此这篇关于利用Python操作MongoDB数据库的文章就介绍到这了,更多相关Python操作MongoDB内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。