Docs 菜单
Docs 主页
/ / /
C#/.NET
/

BSON 操作

在此页面上

  • Overview
  • BSON 数据格式
  • 创建 BSON 文档
  • 更改 BSON 文档
  • 将 BSON 写入文件
  • 从文件中读取 BSON
  • API 文档

在本指南中,可以了解如何使用 .NET/C# 驱动程序创建 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"
}

要使用 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"}
};

BsonDocument 类包含一系列方法,让您可以修改 BSON 文档的内容。以下代码示例对之前的 BsonDocument 对象进行了三处更改:

  1. 添加值为 "12345" 的新字段 "restaurant_id"

  2. 删除 "cuisine" 字段

  3. "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 文档

您可以使用 BsonBinaryWriter 类中的方法将 BSON 写入文件。要写入文件,请执行以下步骤:

  1. 打开包含 BSON 数据的文件的文件流。

  2. 使用文件流创建 BsonBinaryWriter

  3. 对于每个您要创建的 BSON 文档和子文档,调用 WriteStartDocument()

  4. 在每个 BSON 文档和子文档中,调用 WriteName() 可设置字段名称,调用相应的 Write* 方法可设置其值。每种数据类型都有您应该使用的专用 Write* 方法。

  5. 要开始和结束数组,请使用 WriteStartArray()WriteEndArray()

  6. 在结束对每个文档和子文档的写入时,调用 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 文档写入文件的相同步骤进行操作,但有以下两点不同:

  • 使用 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异常。

提示

BsonBinaryReaderBsonBinaryWriter 构造函数接受任何 System.IO.Stream 对象。这样一来,您就可以对流(stream)可以访问的任何位置进行读取或写入。

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

后退

LINQ