这里采用的是mongoDB官网推荐使用.net驱动:

http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/

有关于MongoDB的安装读者可以参考其他的博客,对于基本的学习来说并不需要进行过多的配置。

创建连接

这一步骤跟ADO.NET连接到数据库的步骤是一样的,ADO.NET是利用SqlConnection连接数据库,而MongoDB则使用MongoClient连接,并在构造函数中将连接字符传递进去,当然可以不传递,那么默认就是连接本地的计算机的默认端口(27017),比如下面的三种连接方式:

1 var client = new MongoClient();
2
3 var client1 = new MongoClient("mongodb://localhost:27017");
4
5 var client2 = new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019");

获取数据库

为了获取数据库,只需要调用MongoClient对象的GetDatabase方法,并传入数据库名称即可,如果数据库存在则直接返回,否则就创建该数据库并返回,比如下面的这段代码将创建名为“foo”的数据库:

var database = client.GetDatabase("foo");
现在database变量就指向了foo数据库了。

获取链表

虽然叫获取链表,但是实际上就是获取数据库中的表,我们可以通过上面database的GetCollection<TDocument>方法获取,比如下面的代码我们将获取一个名为“bar”的表:

var collection = database.GetCollection<BsonDocument>("bar");
我们传入的泛型参数为BsonDocument,这个是自带的,可以动态的容纳各种格式的数据,当然这里还是建议读者使用POCO。

插入一个文档

利用collection对象,我们可以将文档插入其中,比如下面的json格式数据:

{
     "name": "MongoDB",
     "type": "database",
     "count": 1,
     "info": {
         x: 203,
         y: 102
     }
}

下面我们利用BsonDocument对象组织上面的JSON格式的数据:

var document = new BsonDocument
{
    {"name","MongoDB"},
    {"type","Database"},
   {"count",1},
   {"info",new BsonDocument{
         {"x",203},
         {"y",102}
       }
   }
};

然后我们利用collection对象的InsertOneAsync将上面的数据插入其中:

collection.InsertOneAsync(doc);
我们都知道Async为后缀的方法都是支持异步的,但是笔者是在控制台项目中演示的所以没有加上这个await,如果读者实在其他的环境中测试的可以根据情况加上。

插入多个文档

如果需要一次性插入多个文档,我们可以通过InsertManyAsync方法,比如下面的示例我们将插入100条数据:

var documents = Enumerable.Range(0, 100).Select(x => new BsonDocument("counter", x));
collection.InsertManyAsync(documents);

统计文档数量

通过上面的步骤我们已经插入了101条数据,如果在实际开发中我们需要统计数据的数量就可以通过调用CountAsync方法,比如下面的代码:

var count = collection.CountAsync(new BsonDocument());
Console.WriteLine(count.Result);

查询链表

利用Find方法我们可以对链表进行查询,Find方法将返回给我们IFindFluent<TDocument,TProjection>对象,该接口属于链式接口,所以能够提供给我们类似jquery那样的链式变成方式去控制查询操作。

查询链表首条数据

为了获取第一条数据我们可以通过调用FirstOrDefaultAsync方法,该方法会返回第一条数据,如果不存在数据则会返回null,比如下面的代码将会显示链表中的第一条数据:

var firstDoc = collection.Find(new BsonDocument()).FirstOrDefaultAsync();
Console.WriteLine(firstDoc.Result.ToString());
如果读者注意最后的输出,会发现一个_id字段,但是我们并没有插入这个字段,这个字段是mongoDB自动加入的,相信很多人都知道它的作用,这里就不详细解释额。

查询链表中所有数据

如果想将链表中所有的数据都返回可以在Find操作之后调用ToListAsync方法就可以,将会直接返回List<T>类型的结果,比如下面的这段代码:

var documents = collection.Find(new BsonDocument()).ToListAsync().Result;
针对数量较少的数据情况下,上面这种方式是没有问题,但如果我们需要处理大量的数据,那么我们就不能使用上面的这种方式,就需要利用下面的方式,通过ForEachAsync来完成,因为这个方法会在每条数据返回的时候执行一个回调,从而达到并发处理的目的,比如下面这段代码就演示了如何使用:

collection.Find(new BsonDocument()).ForEachAsync(x => Console.WriteLine(x));

通过条件查询单条数据

我们可以在调用Find方法的时候传入一个过滤条件,从而在链表中查询我们希望的数据,比如下面这个例子我们将查询字段“counter”的值为71的数据:

var filter = Builders<BsonDocument>.Filter.Eq("counter", 71);
var document = collection.Find(filter).FirstAsync().Result;
Console.WriteLine(document);
这里我们需要通过Builders的静态对象Filter中的各种条件方法来构造条件,然后在调用Find方法的将其传入即可。

通过条件查询多条数据

我们也可以获取多条数据,比如下面这个例子,我们将搜索出所有“counter”的值大于50的数据:

var filter = Builders<BsonDocument>.Filter.Gt("counter", 50);
var document = collection.Find(filter).ForEachAsync(x => Console.WriteLine(x));

当然我们也可以给定一个范围,比如50到70之间:

var filterBuilder = Builders<BsonDocument>.Filter;
var filter = filterBuilder.Gt("counter", 50) & filterBuilder.Lt("counter", 70);
collection.Find(filter).ForEachAsync(x => Console.WriteLine(x));

对数据排序

下面我们将在查询的基础之上加上排序,排序只需要在在调用Sort方法时传入对应的参数即可,比如下面的例子,我们将对链表先进行查询,然后排序:

var filter = Builders<BsonDocument>.Filter.Exists("counter");
var sort = Builders<BsonDocument>.Sort.Descending("counter");
var documnt = collection.Find(filter).Sort(sort).FirstAsync().Result;

对字段投射

许多时候我们并不需要文档中的所有数据,这就好比在SQL中我们都会只把我们需要的数据select出来,而不会把表中的所有字段的数据都拿出来,自然MongoDB也可以让我这样做,我们只需要跟过滤和排序一样利用Projection构造器来构造然后传递给Project方法中就可以了,下面这个例子中我们将排除“_id”字段:

var projection = Builders<BsonDocument>.Projection.Exclude("_id");
var document = collection.Find(new BsonDocument()).Project(projection).FirstAsync().Result;
Console.WriteLine(document);

更新文档

MongoDB拥有很多更新操作,下面我们将会介绍几个简单的并且常用的更新操作。

如果我们需要更新一个对象(如果条件不匹配那么可能是0条),可以使用UpdateOneAsync方法,并执行过滤条件和需要更新到的文档,比如下面我们将“counter”为1的数据中的“counter”更新为110:

var filter = Builders<BsonDocument>.Filter.Eq("counter", 1);
var updated = Builders<BsonDocument>.Update.Set("counter", 110);
var result = collection.UpdateOneAsync(filter, updated).Result;

如果我们需要批量的更新,我们可以调用UpdateManyAsync即可。比如我们需要将“counter”小于10的数据中的“counter”累加100,那么我们就可以像下面这样来写:

var filter = Builders<BsonDocument>.Filter.Lt("counter", 10);
var updated = Builders<BsonDocument>.Update.Inc("counter", 100);
var result = collection.UpdateManyAsync(filter, updated).Result;

删除文档

作为基础部分这也是最后一个部分了,利用上面的过滤,然后调用DeleteOneAsync或DeleteManyAsync方法就可以了,比如下面的列子就是删除“counter”大于100的所有数据:

var filter = Builders<BsonDocument>.Filter.Gt("counter", 100);
var resut = collection.DeleteManyAsync(filter).Result;

mongodb c#语法基础的更多相关文章

  1. 基于C#的MongoDB数据库开发应用(1)--MongoDB数据库的基础知识和使用

    在花了不少时间研究学习了MongoDB数据库的相关知识,以及利用C#对MongoDB数据库的封装.测试应用后,决定花一些时间来总结一下最近的研究心得,把这个数据库的应用单独作为一个系列来介绍,希望从各 ...

  2. JAVA 入门第一章(语法基础)

    本人初学java 博客分享记录一下自己的学习历程 java我的初步学习分为六章,有c和c++的基础学起来也简便了很多. 第一章 语法基础 第二章 面向对象 第三章 常用工具类 第四章 文件操纵 第五章 ...

  3. python基础入门一(语法基础)

    作为自己正式接触并应用的第一门编程语言,在Alex和武sir两位大王的要求下,开始了写博客总结的日子.学习编程语言是很有趣的一件事情,但有2点请一定要谨记:1.做人靠自己,码代码也必须靠自己.能不能成 ...

  4. PHP语法基础

    1.PHP语法基础 PHP标记符 <?php ?> 常亮与变量 $a = 10; 变量 可以在运行过程中修改 $a = 10; $a = 20; $b = 5; echo $a+$b; c ...

  5. Verilog语法基础讲解之参数化设计

    Verilog语法基础讲解之参数化设计   在Verilog语法中,可以实现参数化设计.所谓参数化设计,就是在一个功能模块中,对于一个常量,其值在不同的应用场合需要设置为不同的置,则将此值在设计时使用 ...

  6. C#语法基础和面向对象编程

    1.C#语法基础 http://www.cnblogs.com/tonney/archive/2011/03/16/1986456.html 2.C#与面向对象基础 很棒的资源,简明扼要,介绍的非常清 ...

  7. Lua脚本之语法基础快速入门

    要 1.基本数据类型 2.Lua中的常用语句结构以及函数 3.Lua中的常用语句结构介绍 4.Lua中的库函数 目录[-] 一.基本数据类型 二.Lua中的常用语句结构以及函数 1.Lua中的常用语句 ...

  8. Mongodb FAQ fundamentals(基础篇)

    Mongodb FAQ(基础篇),是官方文档的翻译.如有翻译不到之处,还请谅解. 1.Mongdb是什么数据库? mongodb是一个面向文档(document)的数据库,既不支持表连接,也不支持事务 ...

  9. Javascript语法基础

    Javascript语法基础   一.基本数据类型   JavaScript中支持数字.字符串和布尔值三种基本数据类型: 1.数字 数字型是JavaScript中的基本数据类型.在JavaScript ...

随机推荐

  1. SkipList 跳表

    1.定义描述      跳跃列表(也称跳表)是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间).      基本上,跳跃列表是对有序的链表增加 ...

  2. Git使用总结

    一.Git的特性 Speed 速度(git是用c语言写的.一般都是提交到本地) Simple design Strong support for non-linear development (tho ...

  3. 对象与Byte数组相互转化工具方法

    /** * 对象转byte * @param obj * @return */ private byte[] ObjectToByte(Object obj) { byte[] bytes = nul ...

  4. 【转载】linux内核启动android文件系统过程分析

    主要介绍linux 内核启动过程以及挂载android 根文件系统的过程,以及介绍android 源代码中文件系统部分的浅析. 主要源代码目录介绍Makefile (全局的Makefile)bioni ...

  5. 谈mvc开发中gzip压缩的应用

    压缩view的内容,可加过滤器 public class GzipFilter : ActionFilterAttribute     {         public override void O ...

  6. 【转载】Linux下编辑生成.mo文件

    转载自:http://www.hackbase.com/tech/2012-02-27/65972.html 编辑生成.mo文件 我们在弄网站的时候很可能会接触到.mo和.po文件..po文件是GNU ...

  7. IconVault – 创建自定义图标字体的神器推荐

    图标字体简单来说就是外观呈现为图标的字体,同时具有矢量图形的特征,在不同的设备上使用图标的时候就不用加载不同尺寸的图片文件,能够减少 HTTP 请求数,提高页面加载速度. IconVault 这款在线 ...

  8. LeetCode——Serialize and Deserialize Binary Tree

    Description: Serialization is the process of converting a data structure or object into a sequence o ...

  9. Vue基础---->VueJS的使用(二)

    组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.今天我们就来学习一 ...

  10. Android学习笔记之DocumentBuilder的使用....

    PS:当你的才华还撑不起你的野心时,那你需要静下心来学习..... 学习内容: 1.从服务器上获取XML文档... 2.解析XML文档中的内容...   XML文件想必大家都非常的熟悉,可扩展的标记语 ...