Overview
在本指南中,您可以学习;了解如何使用PyMongo创建BSON文档、从文件读取BSON以及写入BSON写入文件。
BSON(即 Binary JSON)是MongoDB用于组织和存储数据的数据格式。此数据格式包括所有JSON数据结构类型,并增加了对日期、不同大小整数、ObjectId 和二进制数据等类型的支持。通过包含 BSON 包,您可以在Python应用程序中使用BSON文档。有关支持类型的完整列表,请参阅BSON 类型服务器手册页面。
BSON文档以二进制格式存储在MongoDB集合中,而PyMongo将BSON文档表示为Python字典。将Python字典插入集合时, PyMongo会自动将其转换为BSON文档。同样,当您从集合中检索文档时, PyMongo会将BSON文档转换回Python字典。
以下示例显示了字典和BSON格式的文档。使用 Dictionary 或 BSON标签页查看相应的格式:
{"hello": "world"}
\x16\x00\x00\x00 # total document size \x02 # 0x02 = type String hello\x00 # field name \x06\x00\x00\x00world\x00 # field value \x00 # 0x00 = type EOO ("end of object")
样本数据
本指南中的代码示例使用以下 BSON 文档作为示例:
{ "address" : { "street" : "Pizza St", "zipcode" : "10003" }, "coord" : [-73.982419, 41.579505] "cuisine" : "Pizza", "name" : "Mongo's Pizza" }
创建 BSON 文档
您可以使用与在Python中创建字典相同的符号来创建BSON文档。以下示例创建一个BSON文档来表示前面的示例BSON文档:
document = { "address": { "street": "Pizza St", "zipcode": "10003" }, "coord": [-73.982419, 41.579505], "cuisine": "Pizza", "name": "Mongo's Pizza" }
更改 BSON 文档
您可以使用与在Python中修改字典相同的表示法来修改BSON文档的内容。以下示例对示例BSON文档进行了三项更改:
添加值为
12345
的新字段restaurant_id
删除
cuisine
字段将
name
字段的值设置为"Mongo's Pizza Place"
document["restaurant_id"] = 12345 del document["cuisine"] document["name"] = "Mongo's Pizza Place"
将 BSON 写入文件
要将BSON数据写入文件,请在输出文件上以写入二进制模式打开文件流。 然后,写入每个文档写入输出文件。 使用 bson.encode()
方法确保文档以BSON格式编码。
以下示例将示例BSON文档写入 file.bson
:
with open("file.bson", "w") as file: file.write(bson.encode(document))
从文件中读取 BSON
要从文件读取BSON文档,请在输入文件上以读取二进制模式打开文件流。 然后,在阅读文档时使用 bson.decode()
方法将BSON格式的文档解码。
以下示例从 file.bson
读取示例BSON文档:
with open("file.bson", "rb") as file: data = file.read() document = bson.decode(data) print(document)
{"address": {"street": "Pizza St", "zipcode": "10003"}, "coord": [-73.982419, 41.579505], "cuisine": "Pizza", "name": "Mongo's Pizza"}
使用原始BSON数据
PyMongo支持使用原始BSON文档。以下列表包含一些可能需要使用原始BSON文档的情况:
在数据库或集合之间移动文档
将二进制数据写入磁盘
绕过Python字典转换带来的性能开销
RawBSONDocument
类是BSON文档的表示,可提供对根本的原始BSON字节的访问权限。要使用 RawBSONDocument
对象表示集合中的文档,请将 MongoClient
构造函数的 document_class
参数设立为 RawBSONDocument
。
注意
RawBSONDocument
对象是只读的。要修改 RawBSONDocument
,必须首先将其转换为Python字典。
以下示例将配置 MongoClient
对象以使用 RawBSONDocument
对象对集合进行建模,然后检索前面示例中的示例文档:
from bson.raw_bson import RawBSONDocument client = pymongo.MongoClient("<connection URI>", document_class=RawBSONDocument) collection = client.sample_restaurants.restaurants raw_doc = collection.find_one({"name": "Mongo's Pizza"}) print(type(raw_doc))
<class 'bson.raw_bson.RawBSONDocument'>