Fork me on GitHub
C#中使用MongoDb

首先从网上下载MongoDB。地址http://www.mongodb.org/,找到适合自己的下载

这是我下载的。

在E盘新建个文件夹,将刚才下载的zip解压,将其中bin目录下的文件全部拷贝至刚才新建的文件夹。

然后在其中再建立个data文件夹。

然后通过cmd去启动你的MongoDB

看我红线框出来的即可。上面打错了 - -

然后访问localhost:27017看到如下所示,就表示你的MongoDB已经启动完毕

 

增加:

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Data;
using System.Data.SqlClient;
using MongoDB.Bson;
using MongoDB.Driver;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//连接信息
string conn = "mongodb://localhost";
string database = "demoBase";
string collection = "demoCollection";

MongoServer mongodb = MongoServer.Create(conn);//连接数据库
MongoDatabase mongoDataBase = mongodb.GetDatabase(database);//选择数据库名
MongoCollection mongoCollection = mongoDataBase.GetCollection(collection);//选择集合,相当于表

mongodb.Connect();

//普通插入
var o = new { Uid = 123, Name = "xixiNormal", PassWord = "111111" };
mongoCollection.Insert(o);

//对象插入
Person p = new Person { Uid = 124, Name = "xixiObject", PassWord = "222222" };
mongoCollection.Insert(p);

//BsonDocument 插入
BsonDocument b = new BsonDocument();
b.Add("Uid", 125);
b.Add("Name", "xixiBson");
b.Add("PassWord", "333333");
mongoCollection.Insert(b);

Console.ReadLine();
}
}

class Person {
public int Uid;
public string Name;
public string PassWord;

}
}
复制代码

结果:

都是上述配置写的,程序会自动建立对应的库和集合。

下面的操作不上完整代码了:

复制代码
            /*---------------------------------------------
* sql : SELECT * FROM table
*---------------------------------------------
*/
MongoCursor<Person> p = mongoCollection.FindAllAs<Person>();

/*---------------------------------------------
* sql : SELECT * FROM table WHERE Uid > 10 AND Uid < 20
*---------------------------------------------
*/
QueryDocument query = new QueryDocument();
BsonDocument b = new BsonDocument();
b.Add("$gt", 10);
b.Add("$lt", 20);
query.Add("Uid", b);

MongoCursor<Person> m = mongoCollection.FindAs<Person>(query);

/*-----------------------------------------------
* sql : SELECT COUNT(*) FROM table WHERE Uid > 10 AND Uid < 20
*-----------------------------------------------
*/
long c = mongoCollection.Count(query);

/*-----------------------------------------------
* sql : SELECT Name FROM table WHERE Uid > 10 AND Uid < 20
*-----------------------------------------------
*/
QueryDocument query = new QueryDocument();
BsonDocument b = new BsonDocument();
b.Add("$gt", 10);
b.Add("$lt", 20);
query.Add("Uid", b);
FieldsDocument f = new FieldsDocument();
f.Add("Name", 1);

MongoCursor<Person> m = mongoCollection.FindAs<Person>(query).SetFields(f);
/*-----------------------------------------------
* sql : SELECT * FROM table ORDER BY Uid DESC LIMIT 10,10
*-----------------------------------------------
*/
QueryDocument query = new QueryDocument();
SortByDocument s = new SortByDocument();
s.Add("Uid", -1);//-1=DESC

MongoCursor<Person> m = mongoCollection.FindAllAs<Person>().SetSortOrder(s).SetSkip(10).SetLimit(10);
复制代码



 

 

MongoDB 之 Find查询

 
Find查询是MongoDB中最基本也是最常用的语法。使用起来也非常简单。下面列出了Find的一些基本操作。
> db.news.find()  //select * from [news]
{ "_id" : 10001, "count" : 1, "news" : "i hava a dream", "time" : ISODate("2011-09-05T13:40:58.034Z") }
{ "_id" : 10002, "count" : 2, "news" : "wow! it is very good!", "time" : ISODate("2011-09-05T13:41:57.860Z") }
{ "_id" : 10003, "count" : 3, "news" : "i hava a dream", "time" : ISODate("2011-09-05T13:42:09.794Z") }
{ "_id" : 10004, "count" : 4, "news" : "wow! it is very good!", "time" : ISODate("2011-09-05T13:42:19.185Z") }
{ "_id" : 10005, "count" : 5, "news" : "new a good day", "time" : ISODate("2011-09-05T13:42:36.860Z") }
> db.news.findOne() //select top 1 * from [news]
{ "_id" : 10001, "count" : 1, "news" : "i hava a dream", "time" : ISODate("2011-09-05T13:40:58.034Z") }
> db.news.find({"_id":10001,"count":1})  //select * from [news] where _id=10001 and count=1
{ "_id" : 10001, "count" : 1, "news" : "i hava a dream", "time" : ISODate("2011-09-05T13:40:58.034Z") }
> db.news.find({"count":{"$gt":2,"$lte":4}})  //select * from [news] where count>2 and  count<=4
{ "_id" : 10003, "count" : 3, "news" : "i hava a dream", "time" : ISODate("2011-09-05T13:42:09.794Z") }
{ "_id" : 10004, "count" : 4, "news" : "wow! it is very good!", "time" : ISODate("2011-09-05T13:42:19.185Z") }
> stime = new Date()
ISODate("2011-09-05T13:57:21.812Z")
> db.news.find({"time":{"$lt":stime}}) //select * from news where time<ISODate("2011-09-05T13:57:21.812Z")
{ "_id" : 10001, "count" : 1, "news" : "i hava a dream", "time" : ISODate("2011-09-05T13:40:58.034Z") }
{ "_id" : 10002, "count" : 2, "news" : "wow! it is very good!", "time" : ISODate("2011-09-05T13:41:57.860Z") }
{ "_id" : 10003, "count" : 3, "news" : "i hava a dream", "time" : ISODate("2011-09-05T13:42:09.794Z") }
{ "_id" : 10004, "count" : 4, "news" : "wow! it is very good!", "time" : ISODate("2011-09-05T13:42:19.185Z") }
{ "_id" : 10005, "count" : 5, "news" : "new a good day", "time" : ISODate("2011-09-05T13:42:36.860Z") }
> db.news.find({"count":{"$gt":2,"$lte":4}},{"_id":0,"time":1,"news":1}) // select time,news from [news] where count>2 and count<=4
{ "news" : "i hava a dream", "time" : ISODate("2011-09-05T13:42:09.794Z") }
{ "news" : "wow! it is very good!", "time" : ISODate("2011-09-05T13:42:19.185Z") }
 
下面是对应的C#代码
FindAllAs<TDocument>()是一个泛型方法,可以用原生态BsonDocument和自定义类型News作为类型参数。MongoCursor<TDocument> FindAs<TDocument>(IMongoQuery query) 泛型查找,MongoCursor FindAs(Type, IMongoQuery)指定Type类型,并且两个方法都返回游标。而且MongoDB也提供Linq的查询操作。
 
MongoDB Find查询

MongoDB Find查询 1 public class News
{
public int _id { get; set; }
public int count { get; set; }
public string news { get; set; }
public DateTime time { get; set; }
}

MongoCursor<BsonDocument> allDoc = coll.FindAllAs<BsonDocument>();
BsonDocument doc = allDoc.First(); //BsonDocument类型参数

MongoCursor<News> allNews = coll.FindAllAs<News>();
News aNew = allNews.First(); //News类型参数

News firstNews = coll.FindOneAs<News>(); //查找第一个文档

QueryDocument query = new QueryDocument(); //定义查询文档
query.Add("_id", 10001);
query.Add("count", 1);
MongoCursor<News> qNews = coll.FindAs<News>(query);


BsonDocument bd = new BsonDocument();//定义查询文档 count>2 and count<=4
bd.Add("$gt", 2);
bd.Add("$lte", 4);
QueryDocument query_a = new QueryDocument();
query_a.Add("count",bd);

FieldsDocument fd = new FieldsDocument();
fd.Add("_id", 0);
fd.Add("count", 1);
fd.Add("time", 1);

MongoCursor<News> mNewss = coll.FindAs<News>(query_a).SetFields(fd);//只返回count和time

var time = BsonDateTime.Create("2011/9/5 23:26:00");
BsonDocument db_t = new BsonDocument();
db_t.Add("$gt", time);
QueryDocument qd_3 = new QueryDocument();
qd_3.Add("time", db_t);

MongoCursor<News> mNews = coll.FindAs<News>(qd_3);//

复制代码
 1     public class News
 2     {
 3         public int _id { getset; }
 4         public int count { getset; }
 5         public string news { getset; }
 6         public DateTime time { getset; }
 7     }
 8 
 9 MongoCursor<BsonDocument> allDoc = coll.FindAllAs<BsonDocument>();
10 BsonDocument doc = allDoc.First(); //BsonDocument类型参数
11 
12 MongoCursor<News> allNews = coll.FindAllAs<News>();
13 News aNew = allNews.First(); //News类型参数
14 
15 News firstNews = coll.FindOneAs<News>(); //查找第一个文档
16 
17 QueryDocument query = new QueryDocument(); //定义查询文档
18 query.Add("_id"10001);
19 query.Add("count"1);
20 MongoCursor<News> qNews = coll.FindAs<News>(query);
21 
22 
23 BsonDocument bd = new BsonDocument();//定义查询文档 count>2 and count<=4
24 bd.Add("$gt"2);
25 bd.Add("$lte"4);
26 QueryDocument query_a = new QueryDocument();
27 query_a.Add("count",bd);
28 
29 FieldsDocument fd = new FieldsDocument();
30 fd.Add("_id"0);
31 fd.Add("count"1);
32 fd.Add("time"1);
33 
34 MongoCursor<News> mNewss = coll.FindAs<News>(query_a).SetFields(fd);//只返回count和time
35 
36 var time = BsonDateTime.Create("2011/9/5 23:26:00");
37 BsonDocument db_t = new BsonDocument();
38 db_t.Add("$gt", time);
39 QueryDocument qd_3 = new QueryDocument();
40 qd_3.Add("time", db_t);
41 
42 MongoCursor<News> mNews = coll.FindAs<News>(qd_3);//
复制代码

 

如果要看更多,请访问我之前的MongoDb系列文章
作者: Yoolo

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 

 
分类: Asp.netC#NoSql项目札记
MongoDB
 
Mongodb源码分析--Replication之OpLog
摘要: 在之前的文章中,介绍了关于master-slave模式下的主从端代码的执行流程,因为当时篇幅所限,未对oplog的数据结构以及mongodb的 local数据库作过多阐述,而这可能会让不知道其内容的朋友看代码时云里雾里找不到头绪,今天我专门用一篇文章来大致解释一下(这些内容可能会在后面章节中有所涉及)。首先了解一个local数据库: 在mongod中,出于特殊目的(复制机制),保留性使用了local数据库。当使用认证机制时,对local数据库等同于认证admin数据库。阅读全文
posted @ 2011-06-27 11:50 代震军 阅读(3016) | 评论 (3) 编辑
 
Mongodb源码分析--Replication之主从模式--Slave
摘要: 在上文中介绍了主从(master-slave)模式下的一些基本概念及master的执行流程。今天接着介绍一下从(slave)结点是如何发起请求,并通过请求获取的oplog信息来构造本地数据的。 不过开始今天的正文前,需要介绍一下mongodb在slave结点上进行数据同步时的一个大致流程:阅读全文
posted @ 2011-06-20 08:32 代震军 阅读(1762) | 评论 (5) 编辑
 
Mongodb源码分析--Replication之主从模式--Master
摘要: mongodb中提供了复制(Replication)机制,通过该机制可以帮助我们很容易实现读写分离方案,并支持灾难恢复(服务器断电)等意外情况下的数据安全。在老版本(1.6)中,Mongo提供了两种方式的复制:master-slave及replica pair模式(注:mongodb最新支持的replset复制集方式可看成是pair的升级版,它解决pair只能在两个结点间同步的限制,支持多个结点同步且支持主从宕机时的自动切换)。阅读全文
posted @ 2011-06-13 12:47 代震军 阅读(2906) | 评论 (7) 编辑
 
Mongodb源码分析--链接池(ConnPool)
摘要: 在之前的一篇文章中,介绍了mongos的balaner的执行流程,其中在源码中的Balancer::run()方法里简单说明了为了连接到 configserver,balancer通过构造ScopedDbConnection实现来链接并执行相应操作,因为当时篇幅所限,只是该链接使用池化的方式一带而过,今天就专门介绍一下mongodb中使用池化方式来管理链接对象以提升链接效率的原理。阅读全文
posted @ 2011-06-07 09:03 代震军 阅读(2768) | 评论 (1) 编辑
 
Mongodb源码分析--Mongos之balancer(均衡)
摘要: 在之前的一篇文章中,介绍了mongos的启动流程,在那篇文章的结尾,介绍了mongos使用balancer来进行均衡,今天就继续讲其实现方式。首先我们看一下Balancer及相关实现策略的类图:阅读全文
posted @ 2011-05-23 10:53 代震军 阅读(2563) | 评论 (8) 编辑
 
Mongodb源码分析--Mongos
摘要: MongoDB提供了auto-sharding 功能。因为其是auto-sharding,即mongodb通过mongos(一个自动分片模块,用于构建一个大规模的可扩展的数据库集群,这个集群可以并入动态增加的机器)自动建立一个水平扩展的数据库集群系统,将数据库分表存储在sharding的各个节点上。阅读全文
posted @ 2011-05-16 10:16 代震军 阅读(3655) | 评论 (2) 编辑
 
Mongodb源码分析--查询结果集封装
摘要: 在这个系列的开头几篇文章中,曾经介绍了Mongodb的查询流程,因为篇幅所限,并未介绍对cursor进行遍历查询时,如何将查询记录装填进结果集中。今天就针对诸如"select top n"这类返回一定数量记录的查询操作,来分析mongodb是如何将查询结果装填到结果集中的。这里要说明的是之前文章中的大部分程序流程,在select top 这类操作也都是要执行的,所以这里接着之前文章所说的内容,继续向底层挖掘相应的功能逻辑:阅读全文
posted @ 2011-05-05 18:00 代震军 阅读(2492) | 评论 (6) 编辑
 
Mongodb源码分析--Command体系架构
摘要: Command在Mongodb中是一类特殊操作,它提供了强大的管理及各项操作(比如建库,索引,删除集合等)。可以说通过Command可以完成几乎所有想做的事情。同时Mongodb开发者在Command上又做了非常清晰体系架构和设计,便于管理和高效执行各种类型的Command。 今天就专门用一篇篇幅来着重介绍一下其Command的体系架构,并用例子来介绍mongod是如何将Command引入其中的。阅读全文
posted @ 2011-04-29 11:55 代震军 阅读(1659) | 评论 (2) 编辑
 
Mongodb源码分析--内存文件映射(MMAP)
摘要: 在Mongodb中,其使用了操作系统底层提供的内存映射机制,即MMAP。MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做,而不需要read/write函数了。同时操作系统会将数据刷新保存到磁盘上。如下图:阅读全文
posted @ 2011-04-25 08:36 代震军 阅读(3839) | 评论 (5) 编辑
 
Mongodb源码分析--游标Cursor
摘要: 在Mongodb中,其提供了类似关系型数据中cursor对象来遍历数据集合,同时mongodb并要根据不同的场景生成不同的游标对象(cursor),比如顺序遍历游标(basicCursor),反向游标(reverseCursor), B树索引游标(btreeCursor)等。 下面是其游标体系架构类图,cursor.cpp, cursor.h, clientcursor.cpp, clientcursor.h阅读全文
posted @ 2011-04-15 11:29 代震军 阅读(2398) | 评论 (6) 编辑
 
Mongodb源码分析--更新记录
摘要: 在之前的一篇文章中,介绍了assembleResponse函数(位于instance.cpp第224行),它会根据op操作枚举类型来调用相应的crud操作,枚举类型定义如下: 可以看到dbUpdate = 2001 为更新操作枚举值,下面我们看一下assembleResponse在确定是更新操作时调用的方法,如下:阅读全文
posted @ 2011-04-11 09:49 代震军 阅读(2534) | 评论 (5) 编辑
 
Mongodb源码分析--删除记录
摘要: 在之前的一篇文章中,介绍了assembleResponse函数(位于instance.cpp第224行),它会根据op操作枚举类型来调用相应的crud操作,枚举类型定义如下...可以看到dbDelete = 2002 为删除操作枚举值。当客户端将要删除的记录(或条件的document)发到服务端之后,mongodb通过消息封装方式将数据包中的字节流解析转成 message类型,并进一步转换成dbmessage之后,mongodb就会根据消息类型进行判断,以决定接下来执行的操作),下面我们看一下 assembleResponse在确定是删除操作时调用的方法,如下:阅读全文
posted @ 2011-04-06 14:11 代震军 阅读(2332) | 评论 (1) 编辑
 
Mongodb源码分析--消息(message)
摘要: 在Mongodb中,客户端和服务端进行通信是基于mongodb wire protocol。说白了,该协议是一个简单的基于socket,请求/响应方式的协议,客户端使用常规的TCP/IP套接字(socket)进行通信。客户端与服务端使用约定的消息(格式)进行通信,其消息头结构与C语言中的struct类似。具体的代码(位于message.cpp):阅读全文
posted @ 2011-04-02 14:45 代震军 阅读(2384) | 评论 (3) 编辑
 
Mongodb源码分析--插入记录及索引B树构建
摘要: 在之前的mongodb查询流程中,介绍了assembleResponse函数(位于instance.cpp第224行),它会根据op操作枚举类型来调用相应的crud操作,枚举类型定义如下: enum Operations { opReply = 1, /* reply. responseTo is set. */ dbMsg = 1000, /* generic msg command followed by a string */ dbUpdate = 2001, /* update object */阅读全文
posted @ 2011-03-30 13:23 代震军 阅读(2948) | 评论 (11) 编辑
 
Mongodb源码分析--日志及持久化
摘要: 在本系列的第一篇文章(主函数入口)中,介绍了mongodb会在系统启动同时,初始化了日志持久化服务,该功能貌似是1.7版本后引入到系统中的,主要用于解决因系统宕机时,内存中的数据未写入磁盘而造成的数据丢失。其机制主要是通过log方式定时将操作日志(如cud操作等)记录到db的journal文件夹下,这样当系统再次重启时从该文件夹下恢复丢失的(内存)数据。阅读全文
posted @ 2011-03-21 15:45 代震军 阅读(3554) | 评论 (2) 编辑
 
mongodb源码分析--查询
摘要: 在之前的一篇文章中,介绍了mongodb的主程序入口main()的执行流程,其实main只是实始化一些参数信息并做了些后台线程任务的启动工作(包括数据准备和恢复),并最终启动一个线程进行循环侦听。今天将会介绍在mongodb中数据查询 (find)的流程,以了解mongodb是如果对message进行拆包分析,以及数据进行表扫描及索引使用的。阅读全文
posted @ 2011-03-18 17:26 代震军 阅读(4689) | 评论 (1) 编辑
 
Mongodb源码分析--主程序入口main()
摘要: 作为这个系列的开篇,本人特此声明,因为本人技术功力有限,且对mongodb源码目前也在研究探索中,可能会对mongodb内部某些实现机制及原作者的意图领会不够精确,因此错误再所难免,希望大家批评指正。另外本文所使用的mongodb源码为1.8 rc1,同时如果有条件的话,大家可以安装vs2010,用C++来编译调试mongodb源码,以便通过运行过程中的数据和流程来验证自己的判断。阅读全文
posted @ 2011-03-17 17:52 代震军 阅读(4858) | 评论 (9) 编辑
 
VS2010 C++下编译调试MongoDB源码
摘要: 考虑到mongodb使用了boost库源码,参考mongodb官方文档后,下载编译boost版本是1.42(时间为2010-2-2)或更新版本: boost版本1.42: http://sourceforge.net/projects/boost/files/boost/1.42.0/boost_1_42_0.zip/download阅读全文
posted @ 2011-03-07 13:25 代震军 阅读(5511) | 评论 (16) 编辑
 
基于MongoDB分布式存储进行MapReduce并行查询
摘要: 之前的文章中介绍了如何基于Mongodb进行关系型数据的分布式存储,有了存储就会牵扯到查询。虽然用普通的方式也可以进行查询,但今天要介绍的是如何使用MONGODB中提供的MapReduce功能进行查询。有关MongoDb的MapReduce之前我写过一篇文章 Mongodb Mapreduce 初窥,今天介绍如何基于sharding机制进行mapreduce查询。在MongoDB的官方文档中,这么一句话:阅读全文
posted @ 2010-09-09 14:14 代震军 阅读(3486) | 评论 (8) 编辑
 
基于Mongodb分布式存储物理文件
摘要: 在之前的文章中介绍了如何对关系型数据数据通过auto-sharding进行分布式数据存储,今天介绍如何对物理文件(小文件,基本小于100K)进行分布式存储。接着看一下要配置的测试环境(与前一篇中类似):模拟2个shard服务和一个config服务, 均运行在10.0.4.85机器上,只是端口不同:阅读全文
posted @ 2010-09-08 18:03 代震军 阅读(4274) | 评论 (11) 编辑
 
基于Mongodb进行分布式数据存储
摘要: 注:本文是研究Mongodb分布式数据存储的副产品,通过本文的相关步骤可以将一个大表中的数据分布到几个mongo服务器上。MongoDB的1.6版本中auto-sharding功能基本稳定并可以尝试放到生产环境下使用。因为其是auto-sharding,即mongodb通过mongos(一个自动分片模块,用于构建一个大规模的可扩展的数据库集群,这个集群可以并入动态增加的机器)自动建立一个水平扩展的数据库集群系统,将数据库分表存储在sharding的各个节点上。 阅读全文
posted @ 2010-09-07 13:30 代震军 阅读(6274) | 评论 (21) 编辑
 
使用Mongodb存储上传物理文件并进行SQUID加速(基于aspx页面)
摘要: 之前在阅读MongoDB GFS文档时,学习了它如何存储物理文件(包括大文件)的方式。为了加深印象,专门写了一个上传文件存储到Mongodb的示例。当然后因为是存储到文档数据库中,所以就不能用普通方式来访问这些物理文件了,这里又专门写了一个aspx页面专门读取这些文件(比如图片或MP3等),所以下载示例之后会看到两个页面,一个是uploadfile.aspx(上传),一个是getfile.aspx(从mongodb中把文件以流的方式读出来)。当然考虑到访问速度,这里还引入了SQUID来进行文件加速(当前SQUID默认只缓存静态文件,所以这里要对ASPX页面的输出进行一下设置,这些都会在本文中进行介绍)阅读全文
posted @ 2010-08-19 13:56 代震军 阅读(3865) | 评论 (17) 编辑
 
Discuz!NT千万级数据量上的两驾马车--TokyoCabinet,MongoDB
摘要: 在Discuz!NT的企业版设计过程中,处理大数据表一直是一个让人头疼的问题,特别是像主题表(topic),用户表(user)等,因为对于一个流量和发帖量都很大的论坛而言,在运行几年之后,这两个表的数据量可能会破千万(注:因为帖子表采用分表机制,所以这里暂未涉及,但出于性能考虑,也提供了本文中类似的解决方案)。当时考虑的架构设计中有两种思路来解决这种问题:阅读全文
posted @ 2010-07-22 11:47 代震军 阅读(8476) | 评论 (16) 编辑
 
Mongodb Mapreduce 初窥
摘要: 声明:本文是学习Mongodb过程中的副产品,因为接触时间并不长,难免有理解上的偏差,希望借此文与感兴趣的朋友讨论切磋,呵呵。去年年底,开始接触并学习Mapreduce模型。因为工作上的关系,最近开始研究Mongodb,其中对其新特性(2010年四月)reduce模型实现产生的兴趣,因为特别留意了一下。当然网上关于该方面的内容并不是很多,且多为EN文,所以我想有必要将学习使用过程中的一些问题作一下记录并加以整理,因为就有了此文。废话不多说了,开始正文吧!目前支持Mongodb的C#客户端应该就是Samuel Corder 开源的这个项目了,链接:http://github.com/samus/mongodb-csharp阅读全文
posted @ 2010-06-10 17:01 代震军 阅读(9566) | 评论 (21) 编辑
 
分类: C#
posted on 2012-06-25 15:36  HackerVirus  阅读(625)  评论(0编辑  收藏  举报