BSON 操作
Overview
在本指南中,可以了解如何使用 .NET/C# 驱动程序创建 BSON 文档、从文件读取 BSON 以及将 BSON 写入文件。
BSON 数据格式
BSON 或二进制 JSON 是 MongoDB 用来组织和存储数据的数据格式。这种数据格式包括所有 JSON 数据结构类型,并增加了对日期、不同大小的整数、ObjectId 和二进制数据等类型的支持。有关支持类型的完整列表,请参阅 BSON 类型服务器手册页面。
本指南中的代码示例使用以下 BSON 文档作为示例:
{ "address" : { "street" : "Pizza St", "zipcode" : "10003" }, "coord" : [-73.982419, 41.579505] "cuisine" : "Pizza", "name" : "Mongo's Pizza" }
创建 BSON 文档
要使用 C# 构建 BSON 文档,请创建 BsonDocument
类的实例。BsonDocument
构造函数接受 BsonElement
参数,这些参数将映射到文档中的字段和值。每个 BsonElement
可以是 BsonElement
类的实例,也可以是大括号 ({}
) 内的字段-值对。
以下代码示例展示了如何创建 BsonDocument
对象来表示示例 BSON 文档。BsonDocument
对象中的每个键值对都是一个 BsonElement
对象。
var newRestaurant = new BsonDocument { { "address", new BsonDocument { { "street", "Pizza St" }, { "zipcode", "10003" } } }, { "coord", new BsonArray {-73.982419, 41.579505 } }, { "cuisine", "Pizza" }, { "name", "Mongo's Pizza"} };
更改 BSON 文档
BsonDocument
类包含一系列方法,让您可以修改 BSON 文档的内容。以下代码示例对之前的 BsonDocument
对象进行了三处更改:
添加值为
"12345"
的新字段"restaurant_id"
删除
"cuisine"
字段将
"name"
字段的值设置为"Mongo's Pizza Palace"
var newRestaurant = new BsonDocument { { "address", new BsonDocument { { "street", "Pizza St" }, { "zipcode", "10003" } } }, { "coord", new BsonArray {-73.982419, 41.579505 } }, { "cuisine", "Pizza" }, { "name", "Mongo's Pizza"} }; newRestaurant.Add(new BsonElement("restaurant_id", "12345")); newRestaurant.Remove("cuisine"); newRestaurant.Set("name", "Mongo's Pizza Palace");
注意
有关 BsonDocument
类方法的完整列表,请参阅 API 文档。
将 BSON 写入文件
您可以使用 BsonBinaryWriter
类中的方法将 BSON 写入文件。要写入文件,请执行以下步骤:
打开包含 BSON 数据的文件的文件流。
使用文件流创建
BsonBinaryWriter
。对于每个您要创建的 BSON 文档和子文档,调用
WriteStartDocument()
。在每个 BSON 文档和子文档中,调用
WriteName()
可设置字段名称,调用相应的Write*
方法可设置其值。每种数据类型都有您应该使用的专用Write*
方法。要开始和结束数组,请使用
WriteStartArray()
和WriteEndArray()
。在结束对每个文档和子文档的写入时,调用
WriteEndDocument()
。
下面的示例代码展示了如何将示例 BSON 文档写入 myFile.bson
:
string outputFileName = "myFile.bson"; using (var stream = File.OpenWrite(outputFileName)) using (var writer = new BsonBinaryWriter(stream)) { writer.WriteStartDocument(); //address writer.WriteName("address"); writer.WriteStartDocument(); writer.WriteName("street"); writer.WriteString("Pizza St"); writer.WriteName("zipcode"); writer.WriteString("10003"); writer.WriteEndDocument(); //coord writer.WriteName("coord"); writer.WriteStartArray(); writer.WriteDouble(-73.982419); writer.WriteDouble(41.579505); writer.WriteEndArray(); //cuisine writer.WriteName("cuisine"); writer.WriteString("Pizza"); //name writer.WriteName("name"); writer.WriteString("Mongo's Pizza"); writer.WriteEndDocument(); }
生成的 BSON 文档如下所示:
{ "address" : { "street" : "Pizza St", "zipcode" : "10003" }, "coord" : [-73.982419, 41.579505] "cuisine" : "Pizza", "name" : "Mongo's Pizza" }
从文件中读取 BSON
要从一个文件读取 BSON 文档,请按照将 BSON 文档写入文件的相同步骤进行操作,但有以下两点不同:
使用
BsonBinaryReader
代替BsonBinaryWriter
。使用
Read*
方法而不是Write*
方法。这些方法会从 BSON 文档中返回字段名称和值。
以下代码示例显示了如何从存储在 myFile.bson
中的示例 BSON 文档中读取字段和值:
string inputFileName = "myFile.bson"; using (var stream = File.OpenRead(inputFileName)) using (var reader = new BsonBinaryReader(stream)) { reader.ReadStartDocument(); //address string addressFieldName = reader.ReadName(); reader.ReadStartDocument(); string streetFieldName = reader.ReadName(); string streetValue = reader.ReadString(); string zipFieldName = reader.ReadName(); string zipValue = reader.ReadString(); reader.ReadEndDocument(); //coord string coordFieldName = reader.ReadName(); reader.ReadStartArray(); double coord1 = reader.ReadDouble(); double coord2 = reader.ReadDouble(); reader.ReadEndArray(); //cuisine string cuisineFieldName = reader.ReadName(); string cuisineValue = reader.ReadString(); //name string nameFieldName = reader.ReadName(); string nameValue = reader.ReadString(); reader.ReadEndDocument(); }
警告
如果连续两次调用 ReadName()
而没有读取数值,驱动程序将抛出 InvalidOperationException
异常。
提示
BsonBinaryReader
和 BsonBinaryWriter
构造函数接受任何 System.IO.Stream
对象。这样一来,您就可以对流(stream)可以访问的任何位置进行读取或写入。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: