ZetCode

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 服务器并检索其数据库。

Program.cs
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 方法在数据库上运行命令。

Program.cs
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 方法,该方法查找应用给定过滤器的文档。

Program.cs
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 方法指定过滤条件,我们将获得所有文档。

Program.cs
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 支持多个查询过滤运算符,例如 GtLtGte

Program.cs
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);

我们使用两个运算符构建过滤器:GtLt

$ dotnet run
{ "_id" : ObjectId("5d4d13d6463315268eb7376b"), "name" : "Audi", "price" : 52000 }
{ "_id" : ObjectId("5d4d1415463315268eb73771"), "name" : "Hummer", "price" : 41400.0 }

我们找到了两个符合条件的文档。

C# MongoDB 插入文档

使用 InsertOne 方法将新文档插入到集合中。

Program.cs
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 选项跳过指定数量的文档。

Program.cs
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 投影

投影确定哪些字段将包含在查询输出中。

Program.cs
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 方法删除文档。

Program.cs
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 方法更新文档。

Program.cs
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 方法采用一个过滤器来查找精确的文档,并采用一个更新操作来执行实际的更改。

来源

MongoDB C# 驱动

在本文中,我们已经在 C# 中使用了 MongoDB。

作者

我叫 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程