C# MongoDB 教程
最后修改于 2023 年 7 月 5 日
C# MongoDB 教程展示了如何在 C# 中进行 MongoDB 编程。
MongoDB
MongoDB 是一个 NoSQL 跨平台面向文档的数据库。它是最受欢迎的数据库之一。MongoDB 由 MongoDB Inc. 开发,并作为自由开源软件发布。
MongoDB 中的记录是一个文档,它是由字段和值对组成的数据结构。 MongoDB 文档类似于 JSON 对象。字段的值可以包括其他文档、数组和文档数组。 MongoDB 将文档存储在集合中。集合类似于关系数据库中的表,文档类似于行。
在底层,MongoDB 以二进制编码格式(称为 BSON)表示 JSON 文档。 BSON 扩展了 JSON 模型,以提供其他数据类型、有序字段,并使其能够有效地在不同语言中进行编码和解码。 .NET 驱动程序使用 BsonDocument 来表示 BSON。
MongoDB.Driver
MongoDB.Driver 是 MongoDB 的官方 .NET 驱动程序。
$ dotnet add package MongoDB.Driver
我们需要将 MongoDB.Driver 包添加到每个 .NET Core 项目。
MongoDB 创建数据库
mongo 工具是一个与 MongoDB 交互的 JavaScript shell 界面,它为系统管理员提供了一个接口,也为开发人员提供了一种直接与数据库测试查询和操作的方式。
$ mongo testdb
MongoDB shell version v4.0.7
connecting to: mongodb://127.0.0.1:27017/testdb?gssapiServiceName=mongodb
...
> db
testdb
> db.cars.insert({name: "Audi", price: 52642})
> db.cars.insert({name: "Mercedes", price: 57127})
> db.cars.insert({name: "Skoda", price: 9000})
> db.cars.insert({name: "Volvo", price: 29000})
> db.cars.insert({name: "Bentley", price: 350000})
> db.cars.insert({name: "Citroen", price: 21000})
> db.cars.insert({name: "Hummer", price: 41400})
> db.cars.insert({name: "Volkswagen", price: 21600})
我们创建一个 testdb 数据库,并在 cars 集合中插入八个文档。我们将在本教程中使用这些数据。
C# MongoDB 列出数据库
第一个例子连接到 MongoDB 服务器并检索其数据库。
using MongoDB.Driver;
using MongoDB.Bson;
namespace SimpleEx
{
class Program
{
static void Main(string[] args)
{
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
var dbList = dbClient.ListDatabases().ToList();
Console.WriteLine("The list of databases are:");
foreach (var item in dbList)
{
Console.WriteLine(item);
}
}
}
}
该示例连接到 MongoDB 服务器并检索其所有数据库。
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
MongoClient 类用于连接到 MongoDB 服务器。 27017 是 MongoDB 服务器监听的默认端口。
var dbList = dbClient.ListDatabases().ToList();
我们使用 ListDatabases 方法获取数据库列表。
foreach (var item in dbList)
{
Console.WriteLine(item);
}
我们遍历列表并打印项目。
$ dotnet run
The list of databases are:
{ "name" : "admin", "sizeOnDisk" : 32768.0, "empty" : false }
{ "name" : "config", "sizeOnDisk" : 86016.0, "empty" : false }
{ "name" : "local", "sizeOnDisk" : 81920.0, "empty" : false }
{ "name" : "test", "sizeOnDisk" : 212992.0, "empty" : false }
{ "name" : "testdb", "sizeOnDisk" : 155648.0, "empty" : false }
C# MongoDB RunCommand
RunCommand 方法在数据库上运行命令。
using MongoDB.Driver;
using MongoDB.Bson;
namespace MongoCommand
{
class Program
{
static void Main(string[] args)
{
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
IMongoDatabase db = dbClient.GetDatabase("testdb");
var command = new BsonDocument { { "dbstats", 1 } };
var result = db.RunCommand<BsonDocument>(command);
Console.WriteLine(result.ToJson());
}
}
}
该示例连接到 testdb 数据库并获取其统计信息。
IMongoDatabase db = dbClient.GetDatabase("testdb");
我们使用 GetDatabase 方法获取数据库。
var command = new BsonDocument { { "dbstats", 1 } };
var result = db.RunCommand<BsonDocument>(command);
使用 RunCommand 方法,我们执行 dbstats 命令。该命令返回一个文档,该文档是 MongoDB 文档的表示形式。
Console.WriteLine(result.ToJson());
我们将文档以 JSON 格式打印到控制台。
$ dotnet run
{ "db" : "testdb", "collections" : 3, "views" : 0, "objects" : 15, "avgObjSize" : 57.0,
"dataSize" : 855.0, "storageSize" : 77824.0, "numExtents" : 0, "indexes" : 3,
"indexSize" : 77824.0, "fsUsedSize" : 160688828416.0, "fsTotalSize" : 254721126400.0, "ok" : 1.0 }
C# MongoDB 查找文档
我们查询具有特定过滤器的文档。过滤器被赋予 Find 方法,该方法查找应用给定过滤器的文档。
using MongoDB.Driver;
using MongoDB.Bson;
namespace FindDocument
{
class Program
{
static void Main(string[] args)
{
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
IMongoDatabase db = dbClient.GetDatabase("testdb");
var cars = db.GetCollection<BsonDocument>("cars");
var filter = Builders<BsonDocument>.Filter.Eq("price", 29000);
var doc = cars.Find(filter).FirstOrDefault();
Console.WriteLine(doc.ToString());
}
}
}
该示例查找价格为 29000 的汽车文档。
var cars = db.GetCollection<BsonDocument>("cars");
我们使用 GetCollection 方法获取 cars 集合。
var filter = Builders<BsonDocument>.Filter.Eq("price", 29000);
创建一个过滤器;我们寻找价格等于 29000 的汽车。
var doc = cars.Find(filter).FirstOrDefault();
我们将过滤器传递给 Find 方法,并使用 FirstOrDefault 方法检索它。
$ dotnet run
{ "_id" : ObjectId("5d4d1408463315268eb7376e"), "name" : "Volvo", "price" : 29000.0 }
C# MongoDB 查找所有文档
如果我们没有为 Find 方法指定过滤条件,我们将获得所有文档。
using MongoDB.Driver;
using MongoDB.Bson;
namespace FindAll
{
class Program
{
static void Main(string[] args)
{
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
IMongoDatabase db = dbClient.GetDatabase("testdb");
var cars = db.GetCollection<BsonDocument>("cars");
var documents = cars.Find(new BsonDocument()).ToList();
foreach (BsonDocument doc in documents)
{
Console.WriteLine(doc.ToString());
}
}
}
}
该示例从 cars 集合中检索所有文档。
$ dotnet run
{ "_id" : ObjectId("5d4d13d6463315268eb7376b"), "name" : "Audi", "price" : 52000 }
{ "_id" : ObjectId("5d4d13f5463315268eb7376c"), "name" : "Mercedes", "price" : 57127.0 }
{ "_id" : ObjectId("5d4d1408463315268eb7376e"), "name" : "Volvo", "price" : 29000.0 }
{ "_id" : ObjectId("5d4d140d463315268eb7376f"), "name" : "Bentley", "price" : 350000.0 }
{ "_id" : ObjectId("5d4d1411463315268eb73770"), "name" : "Citroen", "price" : 21000.0 }
{ "_id" : ObjectId("5d4d1415463315268eb73771"), "name" : "Hummer", "price" : 41400.0 }
{ "_id" : ObjectId("5d4d1419463315268eb73772"), "name" : "Volkswagen", "price" : 21600.0 }
我们得到所有七个文档。
C# MongoDB 查询
Mongo 支持多个查询过滤运算符,例如 Gt、Lt 或 Gte。
using MongoDB.Driver;
using MongoDB.Bson;
namespace MongoQuery
{
class Program
{
static void Main(string[] args)
{
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
IMongoDatabase db = dbClient.GetDatabase("testdb");
var cars = db.GetCollection<BsonDocument>("cars");
var builder = Builders<BsonDocument>.Filter;
var filter = builder.Gt("price", 30000) & builder.Lt("price", 55000);
var docs = cars.Find(filter).ToList();
docs.ForEach(doc => {
Console.WriteLine(doc);
});
}
}
}
该示例打印所有汽车价格在 30000 到 55000 之间的文档。
var filter = builder.Gt("price", 30000) & builder.Lt("price", 55000);
我们使用两个运算符构建过滤器:Gt 和 Lt。
$ dotnet run
{ "_id" : ObjectId("5d4d13d6463315268eb7376b"), "name" : "Audi", "price" : 52000 }
{ "_id" : ObjectId("5d4d1415463315268eb73771"), "name" : "Hummer", "price" : 41400.0 }
我们找到了两个符合条件的文档。
C# MongoDB 插入文档
使用 InsertOne 方法将新文档插入到集合中。
using MongoDB.Driver;
using MongoDB.Bson;
namespace InsertDocument
{
class Program
{
static void Main(string[] args)
{
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
IMongoDatabase db = dbClient.GetDatabase("testdb");
var cars = db.GetCollection<BsonDocument>("cars");
var doc = new BsonDocument
{
{"name", "BMW"},
{"price", 34621}
};
cars.InsertOne(doc);
}
}
}
该示例将新的汽车文档插入到 cars 集合中。
var doc = new BsonDocument
{
{"name", "BMW"},
{"price", 34621}
};
创建一个新的 BsonDocument。
cars.InsertOne(doc);
使用 InsertOne 方法将文档插入到集合中。
C# MongoDB skip 和 limit
limit 查询选项指定要返回的文档数,skip 选项跳过指定数量的文档。
using MongoDB.Driver;
using MongoDB.Bson;
namespace LimitSkip
{
class Program
{
static void Main(string[] args)
{
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
IMongoDatabase db = dbClient.GetDatabase("testdb");
var cars = db.GetCollection<BsonDocument>("cars");
var docs = cars.Find(new BsonDocument()).Skip(3).Limit(3).ToList();
docs.ForEach(doc =>
{
Console.WriteLine(doc);
});
}
}
}
该示例从 testdb.cars 集合中读取数据,跳过前三个文档,并将输出限制为三个文档。
$ dotnet run
{ "_id" : ObjectId("5d4d140d463315268eb7376f"), "name" : "Bentley", "price" : 350000.0 }
{ "_id" : ObjectId("5d4d1411463315268eb73770"), "name" : "Citroen", "price" : 21000.0 }
{ "_id" : ObjectId("5d4d1415463315268eb73771"), "name" : "Hummer", "price" : 41400.0 }
输出包含三个文档。
C# MongoDB 投影
投影确定哪些字段将包含在查询输出中。
using MongoDB.Driver;
using MongoDB.Bson;
namespace Projections
{
class Program
{
static void Main(string[] args)
{
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
IMongoDatabase db = dbClient.GetDatabase("testdb");
var cars = db.GetCollection<BsonDocument>("cars");
var docs = cars.Find(new BsonDocument()).Project("{_id: 0}").ToList();
docs.ForEach(doc =>
{
Console.WriteLine(doc);
});
}
}
}
在此示例中,我们查找所有文档。我们从输出中排除 _id。
$ dotnet run
{ "name" : "Audi", "price" : 52000 }
{ "name" : "Mercedes", "price" : 57127.0 }
{ "name" : "Volvo", "price" : 29000.0 }
{ "name" : "Bentley", "price" : 350000.0 }
{ "name" : "Citroen", "price" : 21000.0 }
{ "name" : "Hummer", "price" : 41400.0 }
{ "name" : "Volkswagen", "price" : 21600.0 }
文档的输出不包含 _id 字段。
C# MongoDB 删除文档
使用 deleteOne 方法删除文档。
using MongoDB.Driver;
using MongoDB.Bson;
namespace DeleteDocument
{
class Program
{
static void Main(string[] args)
{
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
IMongoDatabase db = dbClient.GetDatabase("testdb");
var cars = db.GetCollection<BsonDocument>("cars");
var filter = Builders<BsonDocument>.Filter.Eq("name", "BMW");
cars.DeleteOne(filter);
}
}
}
该示例删除汽车名称为 BMW 的文档。
C# MongoDB 更新文档
使用 UpdateOne 方法更新文档。
using MongoDB.Driver;
using MongoDB.Bson;
namespace UpdateDocument
{
class Program
{
static void Main(string[] args)
{
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
IMongoDatabase db = dbClient.GetDatabase("testdb");
var cars = db.GetCollection<BsonDocument>("cars");
var filter = Builders<BsonDocument>.Filter.Eq("name", "Audi");
var update = Builders<BsonDocument>.Update.Set("price", 52000);
cars.UpdateOne(filter, update);
}
}
}
该示例更新名称为 Audi 的汽车文档。 它为此文档设置一个新价格。
cars.UpdateOne(filter, update);
UpdateOne 方法采用一个过滤器来查找精确的文档,并采用一个更新操作来执行实际的更改。
来源
在本文中,我们已经在 C# 中使用了 MongoDB。
作者
列出所有 C# 教程。