65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 .NET 进行 MongoDB CRUD 操作

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2016年10月2日

CPOL

3分钟阅读

viewsIcon

26899

本文介绍了如何使用 C# 在 MongoDB 中实现 CRUD 操作。

引言

MongoDb 是一个面向文档的开源数据库。这是一个 NoSql 数据库。它将数据存储为 JSON 格式(以 BSON 格式存储动态内容)。本文将解释通过 .NET 在 MongoDB 中实现 CRUD 操作的逐步过程。

背景

这些是 MongoDB 团队开发的已定义的 nu-get 包,用于连接和对 MongoDB 执行操作。这些包有预定义的广泛类,我们将利用它们与 MongoDB 交互。

Using the Code

第一步,我们需要从 nuget 安装 MongoDb Nuget 包。以下是需要在 .NET 解决方案中添加的包。

  1. MongDB.Bson
  2. MongoDB.Driver
  3. MongoDB.Driver.Core

这些包下的类将负责处理开发人员的大部分工作,例如打开和关闭连接、维护池等。因此,它将使我们的 .NET 代码更具可读性和可维护性。

BSON 代表二进制 JSON,是类似 JSON 文档的二进制编码序列化。与 JSON 一样,BSON 支持在其他文档和数组中嵌入文档和数组。 这里有一篇关于 JSON 和 BSON 的白皮书

创建(插入)文档

对于单个文档的插入,我们可以使用以下代码。请注意,在运行此代码之前,MongoDB 实例应该启动并运行。您还可以更改连接字符串以指向您的 MongoDB 服务器。在这里,我们从 MongoDB 获取 test 数据库,并将 BsonDocument 添加到 people 表中。当我们不知道确切的表集合类型时,我们可以使用 BSONDocument 类型。创建文档后,我们通过调用 InsertOneAsync 方法将其添加到 people 集合中。此方法只会向表中添加一个文档。

        static async Task MainAsync(string[] args)
        {
            var ConnectionString = "mongodb://:27017";

            var client = new MongoClient(ConnectionString);
            var db = client.GetDatabase("test");

            var col = db.GetCollection<BsonDocument>("people");

            var doc = new BsonDocument
            {
                {"Name" ,"test" },
                { "Age" ,  33 }
            };

            await col.InsertOneAsync(doc);
        }

要添加多个文档,我们可以使用以下代码。在这里,如上所述,我们创建了两个 BsonDocuments,并使用 InsertManyAsync 方法将它们添加到表集合中。

        static async Task MainAsync(string[] args)
        {
            var ConnectionString = "mongodb://:27017";

            var client = new MongoClient(ConnectionString);
            var db = client.GetDatabase("test");

            var col = db.GetCollection<BsonDocument>("people");

            var doc = new BsonDocument
            {
                {"Name" ,"test" },
                { "Age" ,  33 }
            };

            var doc2 = new BsonDocument
            {
                { "Name" , "Hi"},
                {"Profession" , "PM" }
            };

            await col.InsertManyAsync(new[] { doc, doc2 });
        }

除了 BsonDocument,我们还可以添加我们自己的类类型文档。我们需要创建一个类并创建该类类型文档,并以类似的方式添加。

检索文档

我们可以通过两种方式进行操作。第一种使用 游标 是执行此操作的最有效方法。游标是 Mongo 驱动程序和服务器相互通信的方式,服务器会分批发送它们。以下代码将从 people 集合中获取文档。

     static async Task MainAsync(string[] args)
        {
            var ConnectionString = "mongodb://:27017";

            var client = new MongoClient(ConnectionString);
            var db = client.GetDatabase("test");

            var col = db.GetCollection<BsonDocument>("people");

            using (var cursor  = await col.Find(new BsonDocument()).ToCursorAsync())
            {
                while (await cursor.MoveNextAsync()) //Cursor maintain the batch size here.
                {
                    foreach (var doc in cursor.Current)//represent the current document 
                                                       //in the cursor
                    {
                        Console.WriteLine(doc);
                    }
                }
            }
       }

还有另一种从数据库中检索数据的方式。它更简单、更清晰、更快。但是,它会将所有文档保存在内存中,因此对于某些情况可能不适用。但当您知道集合中有一个或多个文档时,它会很有用。

    static async Task MainAsync(string[] args)
         {
            var ConnectionString = "mongodb://:27017";

            var client = new MongoClient(ConnectionString);
            var db = client.GetDatabase("test");

            var col = db.GetCollection<BsonDocument>("people");

            var list = await col.Find(new BsonDocument()).ToListAsync();

            foreach (var doc in list)
            {
                Console.WriteLine(doc);
            }
        }

以上两种方法展示了我们如何从集合中检索所有文档。如果我们想检索一个特定的文档,我们可以使用过滤器,所有满足条件的文档都将被返回。有一个构建器帮助类,可用于创建过滤器。

更新

这进一步分为两个类别:替换更新。所以首先,看看我们如何替换 MongoDB 中的文档。当我们替换文档时,我们无法替换 ID 字段。

    static async Task MainAsync(string[] args)
      {
         var ConnectionString = "mongodb://:27017";
         var client = new MongoClient(ConnectionString);
         var db = client.GetDatabase("test");

         var col = db.GetCollection<BsonDocument>("people");
            
         await col.ReplaceOneAsync(new BsonDocument("name", "Simon"), 
                                   new BsonDocument("name", "Juli"));

         await col.Find(new BsonDocument()).ForEachAsync(X => Console.WriteLine(X));
      }            

上述代码将把 people 集合中的名称从 Simon 更改为 Juli

这是另一个示例代码,用于根据条件更新记录。在这里,它将姓名是 "Simon" 的人的 Age 增加了 10

   static async Task MainAsync(string[] args)
        {
            var ConnectionString = "mongodb://:27017";

            var client = new MongoClient(ConnectionString);
            var db = client.GetDatabase("test");

            var col = db.GetCollection<BsonDocument>("people");

            await col.UpdateOneAsync(Builders<BsonDocument>.Filter.Eq("name", "Simon"),
                Builders<BsonDocument>.Update.Inc("Age", 10));

            await col.Find(new BsonDocument()).ForEachAsync(X => Console.WriteLine(X));
        }

同样,我们也可以使用 UpdateManyAsync 方法来更新多个文档。

删除

有两个方法用于从 MongoDB 中删除记录。DeleteManyAsyncDeleteOneAsync。顾名思义,一个用于删除单个记录,另一个用于删除多个记录。

以下是从 people 集合中删除文档的示例代码,其中名称为 Simon

await col.DeleteOneAsync(Builders<BsonDocument>.Filter.Eq("name" ,"test1"));

注意:在运行以上所有代码之前,MongoDB 服务器实例应该启动并运行。

希望这能帮助 .NET 开发人员使用 MongoDB。

历史

  • 2016 年 10 月 2 日:初始版本
© . All rights reserved.