在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入
<p><img src="https://img2020.cnblogs.com/blog/1377250/202008/1377250-20200812213830922-252214510.png" alt="" loading="lazy"></p><p>MongoDB,被归类为NoSQL数据库,是一个以类JSON格式存储数据的面向文档的数据库系统.MongoDB在底层以名为bson的二进制编码格式表示JSON文档,MongoDB bson实现是轻量级、快速和高度可遍历的。这意味着MongoDB为用户提供了JSON文档的易用性和灵活性,以及轻量级二进制格式的速度和丰富性。其实在我看来在很多场景中MongoDb都可以取代关系型数据库。</p>
<blockquote>
<p>作者:依乐祝<br>
原文地址:https://www.cnblogs.com/yilezhu/p/13493195.html</p>
</blockquote>
<p>在本教程系列中,我将向您展示如何使用.NET驱动程序提供的CRUD函数在.NET应用程序中使用MongoDB。MongoDB驱动允许您使用来自不同编程语言的MongoDB。在本系列教程中,我们将使用C#驱动程序.</p>
<h3 id="准备工作">准备工作</h3>
<p>在开始之前,我们需要打开VisualStudio并创建一个新项目。我将在本教程中使用一个控制台项目。为了演示我们需要安装对应的NuGet包。这里我们需要三个NuGet包,即:</p>
<ol>
<li><strong>MongoDB.Bson</strong>独立的BSON库,它处理POCOS到BSON类型的转换(这是MongoDB的文件格式),反之亦然。</li>
<li><strong>MongoDB.Driver.Core</strong>:--它本身就是一个驱动程序,具有驱动程序的核心组件(如如何连接到<code>mongod</code>实例,连接池),用于从.net到MongoDB的通信,并且它依赖于<code>MongoDB.Bson</code>.</li>
<li><strong>MongoDB.Driver</strong>*依赖于<code>Driver.Core</code>这反过来又依赖于<code>MongoDB.Bson</code>。它更容易在核心组件驱动程序上使用api,并具有异步方法,并支持Linq.</li>
</ol>
<p>运行以下命令,会同时安装上面三个包:</p>
<pre><code>Install-Package MongoDB.Driver
</code></pre>
<h3 id="访问数据库">访问数据库</h3>
<p>若要连接到数据库,请使用<code>MongoClient</code>类访问MongoDB实例,并通过它选择要使用的数据库。这个类有四个构造函数。</p>
<ul>
<li>默认情况下,连接到端口27017上的实例的无参数结构器:</li>
</ul>
<pre><code class="language-csharp">var client = new MongoClient();
</code></pre>
<ul>
<li>接受连接字符串:</li>
</ul>
<pre><code class="language-csharp">var connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
</code></pre>
<ul>
<li>接受一个<code>MongoUrl</code>的实例,而MongoUrl跟使用<code>connectionstring</code>构造函数很类似,您可以通过使用默认构造函数来创建此类实例:</li>
</ul>
<pre><code class="language-csharp">var client = new MongoClient(new MongoUrl("mongodb://localhost:27017"));
</code></pre>
<p>.或者使用静态的<code>Create</code>方法:</p>
<pre><code class="language-csharp">var client = new MongoClient(MongoUrl.Create("mongodb://localhost:27017"));
</code></pre>
<ul>
<li>最后一个是接受一个<code>MongoClientSettings</code>的构造函数,这里你可以设置很多东西,比如凭据、连接生存期和超时时间等等。下面是两个例子:</li>
</ul>
<pre><code class="language-csharp">var settings1 = MongoClientSettings
.FromUrl(MongoUrl.Create("mongodb://localhost:27017"));
var settings2 = new MongoClientSettings
{
Server = new MongoServerAddress("localhost", 27017),
UseSsl = false
};
var client1 = new MongoClient(settings1);
var client2 = new MongoClient(settings2);
</code></pre>
<p>通常,你只需要使用包含一个<code>connectionString</code>参数的构造函数就可以了,我们将在本教程中使用此构造函数。代码如下所示:</p>
<pre><code class="language-csharp">using MongoDB.Driver;
using System;
namespace MongoDBDemo
{
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
static void Test()
{
var connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
}
}
}
</code></pre>
<p>使用MongoClient实例,我们可以做很多事情,如删除数据库、获取数据库或检索服务器上的数据库名称列表等。这里没有一个用于创建数据库方法,因为一旦您选择一个数据库并将数据插入其中,它将自动创建数据库。</p>
<p>这里我们使用的是<code>GetDatabase</code>方法,它将自动为我们创建一个数据库。如下所示获取一个名为<code>bookstore</code> 的数据库:</p>
<pre><code class="language-csharp">IMongoDatabase db = client.GetDatabase("bookstore");
</code></pre>
<p>这个GetDatabase方法返回一个对象,该对象是数据库的表示形式,我们可以从该对象访问不同的集合并操作数据库。这个<code>MongoClient</code>对象是线程安全的,因此您可以将其放在静态字段中,使其成为可以通过DI容器随时获得的Singleton对象,或者使用相同的连接设置实例化一个新的字段(下面将使用相同的连接池);通过这个对象,您可以选择您想要使用的任何数据库。</p>
<p>使用数据库对象,可以从数据库创建、重命名、检索或获取集合列表。文档存储在集合中,如果你对SQL比较熟悉的话,可以将集合视为表,将文档视为表中的记录。</p>
<h3 id="创建一个集合">创建一个集合</h3>
<p>若要创建集合,我们将使用 <code>IMongoDatabase</code>对象的CreateCollection 或CreateCollection Async方法来进行 。该方法接受三个参数(最后两个参数是可选的):</p>
<ol>
<li>集合的名称。</li>
<li>创建集合的选项</li>
<li>取消令牌</li>
</ol>
<pre><code class="language-csharp"> void CreateCollection(
string name,
CreateCollectionOptions options = null,
CancellationToken cancellationToken = default);
Task CreateCollectionAsync(
string name,
CreateCollectionOptions options = null,
CancellationToken cancellationToken = default);
</code></pre>
<p>这个CreateCollectionOptions指定集合的特殊设置,例如它应该包含的最大文档数。下面是一个例子:</p>
<pre><code class="language-csharp"> IMongoDatabase database = client.GetDatabase("bookstore");
await database.CreateCollectionAsync("books", new CreateCollectionOptions
{
Capped=true,
MaxDocuments=100,
});
</code></pre>
<p>大多数情况下,我们只需要创建一个集合,并使用默认的创建设置,因此我们只需要传递一个<code>collection</code>的名称即可。</p>
<pre><code class="language-csharp">await database.CreateCollectionAsync("books");
</code></pre>
<p>创建集合的另一种方法是使用GetCollection它接受集合的名称和集合设置选项作为参数。使用此方法,即使不存在该名称的集合,一旦创建文档,它也会在此之前创建该集合。这通常是您想要的方式,因此这里建议只在你需要创建一个有上限的集合时才使用CREATE进行集合的创建。</p>
<p>Capped集合是一个固定大小的集合,当它达到最大值时,它会自动覆盖其最旧的条目。GetCollection方法是泛型的,在调用此方法时需要指定文档类型。该类型表示要处理的对象/文档的类型。它可以被强类型化为我们定义的任何类,或者使用<code>BsonDocument</code>类型表示一个允许我们处理集合中任何文档形状的动态架构。</p>
<h3 id="获取一个集合">获取一个集合</h3>
<p>在讨论了创建集合之后,还需要一个额外的步骤来检查集合是否存在,创建它,然后将文档添加到集合中。如果集合不存在,<code>GetCollection</code>会自动创建一个集合,并将文档添加到该集合中。因此,即使有一个<code>CreateCollection</code>,我们通常还是希望使用<code>GetCollection</code>。就像数据库一样,集合也是线程安全的,并且创建起来非常j简单。为了获得一个集合,我们调用<code>GetCollection</code>方法来指定文档类型</p>
<pre><code class="language-csharp"> static async Task TestAsync()
{
var connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("bookstore");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");
}
</code></pre>
<p>BsonDocument是来自MongoDB.Bson包的类型,它表示BSON文档,使用这种类型,我们可以处理来自数据库的任何形状的数据。这包包含了所有基本BSON类型和其他一些用于使用BSON的方法。</p>
<p>在这个包中,我们有表示BSON类型的类,以及如何在.NET类型和BsonValue之间映射。下面简单列举一些:</p>
<ul>
<li>我们已经讨论过的BsonDocument类型</li>
<li>表示BSON元素的BsonElement</li>
<li>BsonValue是各种子类使用的抽象基类,如BsonString、BsonInt 32等。</li>
</ul>
<p>这个<code>BsonDocument</code>是字符串到bson值的字典,因此我们可以像初始化字典一样来进行初始化:</p>
<pre><code class="language-csharp"> var document = new BsonDocument
{
{"bookname", BsonValue.Create(".net core3.1 with mongodb")},
{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程")},
{"tags", new BsonArray(new[] {".net core", "mongodb"}) },
{"remark", "C#是世界上最好的语言" },
{"publishyear", 2020 }
};
</code></pre>
<p>.或者使用<code>Add</code>方法,该方法具有多个重载:</p>
<pre><code class="language-csharp"> var document2 = new BsonDocument();
document2.Add("bookname", ".net core3.1 with mongodb2");
document2.Add("description", "这是一本关于在.net core3.1中使用mongodb进行开发的教程2");
document2.Add("tags", new BsonArray(new[] { ".net core", "mongodb" }));
document2.Add("remark", "C#是世界上最好的语言");
document2.Add("publishyear", 2020);
</code></pre>
<p>.或者使用索引器:</p>
<pre><code class="language-csharp">var document3 = new BsonDocument();
document3["bookname"] = ".net core3.1 with mongodb3";
document3["description"] = "这是一本关于在.net core3.1中使用mongodb进行开发的教程3";
document3["tags"] = new BsonArray(new[] { ".net core", "mongodb" });
document3["remark"] = "C#是世界上最好的语言";
document3["publishyear"] = 2020;
</code></pre>
<h3 id="创建插入文档">创建/插入文档</h3>
<p>文档存储在集合中,在查看了创建和获取集合之后,我们将继续在集合中插入新文档。Mongo集合实例提供了一次插入单个文档和一次插入多个文档的方法。</p>
<p>接下来让我们一步一步来进行实现吧:</p>
<ul>
<li>获取一个<code>IMongocollection</code>类型的对象,该对象表示我们要使用的集合:</li>
</ul>
<pre><code class="language-csharp"> IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");
</code></pre>
<ul>
<li>然后创建我们想要插入的文档:</li>
</ul>
<pre><code class="language-csharp"> var document = new BsonDocument
{
{"bookname", BsonValue.Create(".net core3.1 with mongodb")},
{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程")},
{"tags", new BsonArray(new[] {".net core", "mongodb"}) },
{"remark", "C#是世界上最好的语言" },
{"publishyear", 2020 }
};
</code></pre>
<ul>
<li>最后插入该文件:</li>
</ul>
<pre><code class="language-csharp">await collection.InsertOneAsync(document);
</code></pre>
<p>要想看到这个效果,让我们开始一个<code>mongod</code>实例,并从控制台监视事件的同时运行以下完整代码:</p>
<pre><code class="language-csharp">class Program
{
static async Task Main(string[] args)
{
await TestAsync();
Console.ReadLine();
}
/// <summary>
/// 测试代码
/// </summary>
/// <returns></returns>
static async Task TestAsync()
{
var connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("bookstore");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");
var document = new BsonDocument
{
{"bookname", BsonValue.Create(".net core3.1 with mongodb")},
{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程")},
{"tags", new BsonArray(new[] {".net core", "mongodb"}) },
{"remark", "C#是世界上最好的语言" },
{"publishyear", 2020 }
};
await collection.InsertOneAsync(document);
}
}
</code></pre>
<p>...启动你的mongo服务并运行程序,看到如下所示的数据:<br>
<img src="https://img2020.cnblogs.com/blog/1377250/202008/1377250-20200812213921826-1033313422.png" alt="" loading="lazy"></p>
<p>这里的<code>InsertOneAsync</code>方法还有一个同步的版本</p>
<pre><code class="language-csharp">collection.InsertOne(document);
</code></pre>
<p>我们还可以使用<code>InsertMany</code>或<code>InsertManyAsync</code>方法进行批量插入。假设我们图书馆又来了三本新书,我们可以使用这个方法同时插入所有的内容,并且它们将被插入到一个批中(假设您使用的是MongoDB2.6或更高版本)。要查看此操作,我们将继续更新代码并运行应用程序:</p>
<pre><code class="language-csharp">class Program
{
static async Task Main(string[] args)
{
await TestAsync();
Console.ReadLine();
}
/// <summary>
/// 测试代码
/// </summary>
/// <returns></returns>
static async Task TestAsync()
{
var connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("bookstore");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books");
await collection.InsertManyAsync(GetBooks());
}
static IEnumerable<BsonDocument> GetBooks() => new List<BsonDocument> {
new BsonDocument
{
{"bookname", BsonValue.Create(".net core3.1 with mongodb1")},
{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程1")},
{"tags", new BsonArray(new[] {".net core", "mongodb"}) },
{"remark", "C#是世界上最好的语言" },
{"publishyear", 2020 }
},
new BsonDocument
{
{"bookname", BsonValue.Create(".net core3.1 with mongodb2")},
{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程2")},
{"tags", new BsonArray(new[] {".net core", "mongodb"}) },
{"remark", "C#是世界上最好的语言" },
{"publishyear", 2020 }
},
new BsonDocument
{
{"bookname", BsonValue.Create(".net core3.1 with mongodb2")},
{"description", new BsonString("这是一本关于在.net core3.1中使用mongodb进行开发的教程2")},
{"tags", new BsonArray(new[] {".net core", "mongodb"}) },
{"remark", "C#是世界上最好的语言" },
{"publishyear", 2020 }
},
};
}
</code></pre>
<p>这时候我们再进行夏查询,看到所有数据都入库了<br>
<img src="https://upload-images.jianshu.io/upload_images/2767091-d06745388e0fa700.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="1597204359324.png" loading="lazy"></p>
<p>除了使用<code>BsonDocument</code>,我们通常预先知道我们想要处理的是什么样的数据,并且我们可以为它们创建自定义的.NET类。遵循我们使用<code>books</code>集合的事例,让我们创建一个<code>Book</code>类并插入使用此类表示的新书籍:</p>
<pre><code class="language-csharp">internal class Book
{
public string BookName { get; set; }
public string Description { get; set; }
public IEnumerable<string> Tags { get; set; }
public string Remark { get; set; }
public int PublishYear { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
await TestAsync();
Console.ReadLine();
}
/// <summary>
/// 测试代码
/// </summary>
/// <returns></returns>
static async Task TestAsync()
{
var connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
IMongoDatabase database = client.GetDatabase("bookstore");
IMongoCollection<Book> collection = database.GetCollection<Book>("books");
await collection.InsertManyAsync(GetBooks());
}
static IEnumerable<Book> GetBooks() => new List<Book> {
new Book
{
BookName=".net core3.1 with mongodb21",
Description="这是一本关于在.net core3.1中使用mongodb进行开发的教程21",
Tags=new List<string>{ ".net core", "mongodb"},
Remark="C#是世界上最好的语言",
PublishYear=2020,
},
new Book
{
BookName=".net core3.1 with mongodb22",
Description="这是一本关于在.net core3.1中使用mongodb进行开发的教程22",
Tags=new List<string>{ ".net core", "mongodb"},
Remark="C#是世界上最好的语言",
PublishYear=2020,
},
new Book
{
BookName=".net core3.1 with mongodb23",
Description="这是一本关于在.net core3.1中使用mongodb进行开发的教程23",
Tags=new List<string>{ ".net core", "mongodb"},
Remark="C#是世界上最好的语言",
PublishYear=2020,
},
};
}
</code></pre>
<p>使用上面的代码,我们可以将集合的文档类型更改为新类,并调用<code>InsertManyAsync</code>方法。运行下程序,然后查询下集合数据如下所示:<br>
<img src="https://img2020.cnblogs.com/blog/1377250/202008/1377250-20200812213950938-870099150.png" alt="" loading="lazy"></p>
<h3 id="总结">总结</h3>
<p>通过上面的示例代码的讲解,你应该对如何通过MongoDB .NET 驱动程序来操作MongoDB集合跟文档有所了解了,并且你也应该知道如何进行文档的插入,在下一篇文章中,我将介绍如何对文档进行检索以及为此构建的各种filter及linq查询技巧,有兴趣的可以关注下我的公众号“DotNetCore实战”第一时间进行更新!</p>
<p>参考资料:https://www.codementor.io/@pmbanugo/working-with-mongodb-in-net-1-basics-g4frivcvz</p>
</div>
<div id="MySignature" role="contentinfo">
<div style="border: #e0e0e0 1px dashed; padding: 15px 20px; padding-left: 20px; background: #e5f1f4; position: relative">
<p style="margin-bottom: 5px">作者:依乐祝(祝雷)</p>
<p style="margin-bottom: 5px">
出处:https://www.cnblogs.com/yilezhu
</p>
<p style="margin-bottom: 5px">
联系:1015657114@qq.com 微信:jkingzhu
</p>
<div>
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题或建议,请多多赐教,非常感谢。
</div>
<div>
<img src="https://images.cnblogs.com/cnblogs_com/yilezhu/1359617/o_%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E5%BE%AE%E4%BF%A1%E6%A0%87%E5%87%86%E7%BB%BF%E7%89%88.jpg" alt="DotNetCore实战">
</div>
</div><br><br>
来源:https://www.cnblogs.com/yilezhu/p/13493195.html
頁:
[1]