全球一统世界和谐 發表於 2015-6-14 12:14:00

MongoDB for C#基础入门

<p><span style="font-size: 15px">笔者这里采用的是mongoDB官网推荐使用.net驱动:</span></p>
<p><span style="font-size: 15px">http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/</span></p>
<p><span style="font-size: 15px">有关于MongoDB的安装读者可以参考其他的博客,对于基本的学习来说并不需要进行过多的配置。</span></p>
<p>&nbsp;</p>
<h1>创建连接</h1>
<p><span style="font-size: 15px">这一步骤跟ADO.NET连接到数据库的步骤是一样的,ADO.NET是利用SqlConnection连接数据库,而MongoDB则使用MongoClient连接,并在构造函数中将连接字符传递进去,当然可以不传递,那么默认就是连接本地的计算机的默认端口(27017),比如下面的三种连接方式:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">var</span> client = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MongoClient();
</span><span style="color: rgba(0, 128, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">var</span> client1 = <span style="color: rgba(0, 0, 255, 1)">new</span> MongoClient(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">mongodb://localhost:27017</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 255, 1)">var</span> client2 = <span style="color: rgba(0, 0, 255, 1)">new</span> MongoClient(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">mongodb://localhost:27017,localhost:27018,localhost:27019</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>获取数据库</h1>
<p><span style="font-size: 15px">为了获取数据库,只需要调用<strong>MongoClient</strong>对象的<strong>GetDatabase</strong>方法,并传入数据库名称即可,如果数据库存在则直接返回,否则就创建该数据库并返回,比如下面的这段代码将创建名为“foo”的数据库:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> database = client.GetDatabase(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">foo</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<p><span style="font-size: 15px">现在database变量就指向了foo数据库了。</span></p>
<p>&nbsp;</p>
<h1>获取链表</h1>
<p><span style="font-size: 15px">虽然叫获取链表,但是实际上就是获取数据库中的表,我们可以通过上面database的<strong>GetCollection&lt;TDocument&gt;</strong>方法获取,比如下面的代码我们将获取一个名为“bar”的表:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> collection = database.GetCollection&lt;BsonDocument&gt;(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bar</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<p><span style="font-size: 15px">我们传入的泛型参数为<strong>BsonDocument</strong>,这个是自带的,可以动态的容纳各种格式的数据,当然这里还是建议读者使用POCO。</span></p>
<p>&nbsp;</p>
<h1>插入一个文档</h1>
<p><span style="font-size: 15px">利用collection对象,我们可以将文档插入其中,比如下面的json格式数据:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
   </span>"name": "MongoDB"<span style="color: rgba(0, 0, 0, 1)">,
   </span>"type": "database"<span style="color: rgba(0, 0, 0, 1)">,
   </span>"count": 1<span style="color: rgba(0, 0, 0, 1)">,
   </span>"info"<span style="color: rgba(0, 0, 0, 1)">: {
         x: </span>203<span style="color: rgba(0, 0, 0, 1)">,
         y: </span>102<span style="color: rgba(0, 0, 0, 1)">
   }
}</span></pre>
</div>
<p><span style="font-size: 15px">下面我们利用<strong>BsonDocument</strong>对象组织上面的JSON格式的数据:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> document = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument
{
    {</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MongoDB</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">},
    {</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Database</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">},
   {</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">count</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">},
   {</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">info</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument{
         {</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 128, 1)">203</span><span style="color: rgba(0, 0, 0, 1)">},
         {</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">y</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 128, 1)">102</span><span style="color: rgba(0, 0, 0, 1)">}
       }
   }
};</span></pre>
</div>
<p><span style="font-size: 15px">然后我们利用collection对象的<strong>InsertOneAsync</strong>将上面的数据插入其中:</span></p>
<div class="cnblogs_code">
<pre>collection.InsertOneAsync(doc);</pre>
</div>
<p><span style="font-size: 15px">我们都知道<em><strong>Async</strong></em>为后缀的方法都是支持异步的,但是笔者是在控制台项目中演示的所以没有加上这个await,如果读者实在其他的环境中测试的可以根据情况加上。</span></p>
<p>&nbsp;</p>
<h1>插入多个文档</h1>
<p><span style="font-size: 15px">如果需要一次性插入多个文档,我们可以通过<strong>InsertManyAsync</strong>方法,比如下面的示例我们将插入100条数据:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> documents = Enumerable.Range(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">100</span>).Select(x =&gt; <span style="color: rgba(0, 0, 255, 1)">new</span> BsonDocument(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, x));
collection.InsertManyAsync(documents);</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>统计文档数量</h1>
<p><span style="font-size: 15px">通过上面的步骤我们已经插入了101条数据,如果在实际开发中我们需要统计数据的数量就可以通过调用<strong>CountAsync</strong>方法,比如下面的代码:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> count = collection.CountAsync(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument());
Console.WriteLine(count.Result);</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>查询链表</h1>
<p><span style="font-size: 15px">利用Find方法我们可以对链表进行查询,Find方法将返回给我们<strong>IFindFluent&lt;TDocument,TProjection&gt;</strong>对象,该接口属于链式接口,所以能够提供给我们类似jquery那样的链式变成方式去控制查询操作。</span></p>
<p>&nbsp;</p>
<h3>查询链表首条数据</h3>
<p><span style="font-size: 15px">为了获取第一条数据我们可以通过调用<strong>FirstOrDefaultAsync</strong>方法,该方法会返回第一条数据,如果不存在数据则会返回null,比如下面的代码将会显示链表中的第一条数据:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> firstDoc = collection.Find(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument()).FirstOrDefaultAsync();
Console.WriteLine(firstDoc.Result.ToString());</span></pre>
</div>
<p><span style="font-size: 15px">如果读者注意最后的输出,会发现一个<em><strong>_id</strong></em>字段,但是我们并没有插入这个字段,这个字段是mongoDB自动加入的,相信很多人都知道它的作用,这里就不详细解释额。</span></p>
<p>&nbsp;</p>
<h3>查询链表中所有数据</h3>
<p><span style="font-size: 15px">如果想将链表中所有的数据都返回可以在Find操作之后调用<strong>ToListAsync</strong>方法就可以,将会直接返回List&lt;T&gt;类型的结果,比如下面的这段代码:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> documents = collection.Find(<span style="color: rgba(0, 0, 255, 1)">new</span> BsonDocument()).ToListAsync().Result;</pre>
</div>
<p><span style="font-size: 15px">针对数量较少的数据情况下,上面这种方式是没有问题,但如果我们需要处理大量的数据,那么我们就不能使用上面的这种方式,就需要利用下面的方式,通过<strong>ForEachAsync</strong>来完成,因为这个方法会在每条数据返回的时候执行一个回调,从而达到并发处理的目的,比如下面这段代码就演示了如何使用:</span></p>
<div class="cnblogs_code">
<pre>collection.Find(<span style="color: rgba(0, 0, 255, 1)">new</span> BsonDocument()).ForEachAsync(x =&gt; Console.WriteLine(x));</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>通过条件查询单条数据</h1>
<p><span style="font-size: 15px">我们可以在调用Find方法的时候传入一个过滤条件,从而在链表中查询我们希望的数据,比如下面这个例子我们将查询字段<em>“counter”</em>的值为71的数据:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> filter = Builders&lt;BsonDocument&gt;.Filter.Eq(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">71</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> document =<span style="color: rgba(0, 0, 0, 1)"> collection.Find(filter).FirstAsync().Result;
Console.WriteLine(document);</span></pre>
</div>
<p><span style="font-size: 15px">这里我们需要通过<strong>Builders</strong>的静态对象<strong>Filter</strong>中的各种条件方法来构造条件,然后在调用Find方法的将其传入即可。</span></p>
<p>&nbsp;</p>
<h1>通过条件查询多条数据</h1>
<p><span style="font-size: 15px">我们也可以获取多条数据,比如下面这个例子,我们将搜索出所有<em>“counter”</em>的值大于50的数据:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> filter = Builders&lt;BsonDocument&gt;.Filter.Gt(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">50</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> document = collection.Find(filter).ForEachAsync(x =&gt; Console.WriteLine(x));</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 15px">当然我们也可以给定一个范围,比如50到70之间:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> filterBuilder = Builders&lt;BsonDocument&gt;<span style="color: rgba(0, 0, 0, 1)">.Filter;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> filter = filterBuilder.Gt(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>) &amp; filterBuilder.Lt(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">70</span><span style="color: rgba(0, 0, 0, 1)">);
collection.Find(filter).ForEachAsync(x </span>=&gt; Console.WriteLine(x));</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>对数据排序</h1>
<p><span style="font-size: 15px">下面我们将在查询的基础之上加上排序,排序只需要在在调用<strong>Sort</strong>方法时传入对应的参数即可,比如下面的例子,我们将对链表先进行查询,然后排序:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> filter = Builders&lt;BsonDocument&gt;.Filter.Exists(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> sort = Builders&lt;BsonDocument&gt;.Sort.Descending(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> documnt = collection.Find(filter).Sort(sort).FirstAsync().Result;</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>对字段投射</h1>
<p><span style="font-size: 15px">许多时候我们并不需要文档中的所有数据,这就好比在SQL中我们都会只把我们需要的数据select出来,而不会把表中的所有字段的数据都拿出来,自然MongoDB也可以让我这样做,我们只需要跟过滤和排序一样利用<strong>Projection</strong>构造器来构造然后传递给<strong>Project</strong>方法中就可以了,下面这个例子中我们将排除“_id”字段:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> projection = Builders&lt;BsonDocument&gt;.Projection.Exclude(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">_id</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> document = collection.Find(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BsonDocument()).Project(projection).FirstAsync().Result;
Console.WriteLine(document);</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1><strong>更新文档</strong></h1>
<p><span style="font-size: 15px">MongoDB拥有很多更新操作,下面我们将会介绍几个简单的并且常用的更新操作。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 15px">如果我们需要更新一个对象<strong><span style="color: rgba(255, 255, 255, 1); background-color: rgba(136, 136, 136, 1)">(如果条件不匹配那么可能是0条)</span></strong>,可以使用<strong>UpdateOneAsync</strong>方法,并执行过滤条件和需要更新到的文档,比如下面我们将<em>“counter”</em>为1的数据中的<em>“counter”</em>更新为110:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> filter = Builders&lt;BsonDocument&gt;.Filter.Eq(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> updated = Builders&lt;BsonDocument&gt;.Update.Set(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">110</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> result = collection.UpdateOneAsync(filter, updated).Result;</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 15px">如果我们需要批量的更新,我们可以调用<strong>UpdateManyAsync</strong>即可。比如我们需要将<em>“counter”</em>小于10的数据中的<em>“counter”</em>累加100,那么我们就可以像下面这样来写:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> filter = Builders&lt;BsonDocument&gt;.Filter.Lt(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> updated = Builders&lt;BsonDocument&gt;.Update.Inc(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> result = collection.UpdateManyAsync(filter, updated).Result;</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>删除文档</h1>
<p><span style="font-size: 15px">作为基础部分这也是最后一个部分了,利用上面的过滤,然后调用<strong>DeleteOneAsync</strong>或<strong>DeleteManyAsync</strong>方法就可以了,比如下面的列子就是删除<em>“counter”</em>大于100的所有数据:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> filter = Builders&lt;BsonDocument&gt;.Filter.Gt(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> resut = collection.DeleteManyAsync(filter).Result;</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><em><strong>到此为止,MongoDB的基础部分就结束了。</strong></em></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    Xamarin.Android -> Xamarin.IOS -> 混合 -> Xamarin.Forms<br><br>
来源:https://www.cnblogs.com/yaozhenfa/p/4574898.html
頁: [1]
查看完整版本: MongoDB for C#基础入门