MongoDB入门教程之C#驱动操作实例

作为系列的最后一篇,得要说说C#驱动对mongodb的操作,目前驱动有两种:官方驱动和samus驱动,不过我个人还是喜欢后者,

因为提供了丰富的linq操作,相当方便。

官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads。下载后,还提供了一个酷似msdn的帮助文档。

samus驱动:https://github.com/samus/mongodb-csharp/downloads

下面就具体看看samus驱动,https://github.com/samus/mongodb-csharp/blob/master/examples/Simple/Main.cs上面提供了

一个简单的demo,大体上看看我们就知道怎么玩了。

一: 实践

1:我们建立一个Person实体,MongoAlias特性表示取别名,这里的ID值将会覆盖掉数据库自动生成的_id。

代码如下:

#region 数据实体
    /// <summary>
/// 数据实体
/// </summary>
    public class Person
    {
        [MongoAlias("_id")]
        public string ID { get; set; }

public string Name { get; set; }

public int Age { get; set; }

public DateTime CreateTime { get; set; }
    }
    #endregion

2:初始化一些变量

代码如下:

string connectionString = string.Empty;

string databaseName = string.Empty;

string collectionName = string.Empty;

static MongodbHelper<T> mongodb;

#region 初始化操作
/// <summary>
/// 初始化操作
/// </summary>
        public MongodbHelper()
        {
            connectionString = "Server=127.0.0.1:2222";
            databaseName = "shopex";
            collectionName = "person";
        }
        #endregion

3:为了方便T的继承类使用linq功能,我们还需要映射一下。

代码如下:

#region 实现linq查询的映射配置
        /// <summary>
/// 实现linq查询的映射配置
/// </summary>
        public MongoConfiguration configuration
        {
            get
            {
                var config = new MongoConfigurationBuilder();

config.Mapping(mapping =>
                {
                    mapping.DefaultProfile(profile =>
                    {
                        profile.SubClassesAre(t => t.IsSubclassOf(typeof(T)));
                    });
                    mapping.Map<T>();
                    mapping.Map<T>();
                });

config.ConnectionString(connectionString);

return config.BuildConfiguration();
            }
        }
        #endregion

4:下面是一些基本的CURD的代码,跟写EF代码很类似,写起来好舒服。

代码如下:

#region 插入操作
        /// <summary>
/// 插入操作
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
        public void Insert(T t)
        {
            using (Mongo mongo = new Mongo(configuration))
            {
                try
                {
                    mongo.Connect();

var db = mongo.GetDatabase(databaseName);

var collection = db.GetCollection<T>(collectionName);

collection.Insert(t, true);

mongo.Disconnect();

}
                catch (Exception)
                {
                    mongo.Disconnect();
                    throw;
                }
            }
        }
        #endregion

#region 更新操作
        /// <summary>
/// 更新操作
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
        public void Update(T t, Expression<Func<T, bool>> func)
        {
            using (Mongo mongo = new Mongo(configuration))
            {
                try
                {
                    mongo.Connect();

var db = mongo.GetDatabase(databaseName);

var collection = db.GetCollection<T>(collectionName);

collection.Update<T>(t, func, true);

mongo.Disconnect();

}
                catch (Exception)
                {
                    mongo.Disconnect();
                    throw;
                }
            }
        }
        #endregion

#region 获取集合
        /// <summary>
///获取集合
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
        public List<T> List(int pageIndex, int pageSize, Expression<Func<T, bool>> func, out int pageCount)
        {
            pageCount = 0;

using (Mongo mongo = new Mongo(configuration))
            {
                try
                {
                    mongo.Connect();

var db = mongo.GetDatabase(databaseName);

var collection = db.GetCollection<T>(collectionName);

pageCount = Convert.ToInt32(collection.Count());

var personList = collection.Linq().Where(func).Skip(pageSize * (pageIndex - 1))
                                                   .Take(pageSize).Select(i => i).ToList();

mongo.Disconnect();

return personList;

}
                catch (Exception)
                {
                    mongo.Disconnect();
                    throw;
                }
            }
        }
        #endregion

#region 读取单条记录
        /// <summary>
///读取单条记录
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
        public T Single(Expression<Func<T, bool>> func)
        {
            using (Mongo mongo = new Mongo(configuration))
            {
                try
                {
                    mongo.Connect();

var db = mongo.GetDatabase(databaseName);

var collection = db.GetCollection<T>(collectionName);

var single = collection.Linq().FirstOrDefault(func);

mongo.Disconnect();

return single;

}
                catch (Exception)
                {
                    mongo.Disconnect();
                    throw;
                }
            }
        }
        #endregion

#region 删除操作
        /// <summary>
/// 删除操作
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
        public void Delete(Expression<Func<T, bool>> func)
        {
            using (Mongo mongo = new Mongo(configuration))
            {
                try
                {
                    mongo.Connect();

var db = mongo.GetDatabase(databaseName);

var collection = db.GetCollection<T>(collectionName);

//这个地方要注意,一定要加上T参数,否则会当作object类型处理
//导致删除失败
                    collection.Remove<T>(func);

mongo.Disconnect();

}
                catch (Exception)
                {
                    mongo.Disconnect();
                    throw;
                }
            }
        }
        #endregion

5.   好,我们开一下2222端口,由于前前篇我已经把这个mongodb做成了服务,现在就直接连过去了,并做一下对Name的索引。

6. 一切准备妥当,我们做下基本的操作,比如这里我添加一千条数据,注意我开启的是安全模式,如果插入不成功,将会抛出异常。

 <1> Add:

代码如下:

static void Main(string[] args)
        {
            MongodbHelper<Person> helper = new MongodbHelper<Person>();

//插入1000条数据
            for (int i = 0; i < 1000; i++)
            {
                helper.Insert(new Person()
                {
                    ID = Guid.NewGuid().ToString(),
                    Name = "jack" + i,
                    Age = i,
                    CreateTime = DateTime.Now
                });
            }

Console.WriteLine("插入成功");

Console.Read();
        }

乍一看显示的数据以为有问题,为什么没有出现jack0或者jack999,不过find的一下后心情舒坦了。

<2> update:   这里就把jack941的名字改掉“mary”

代码如下:

static void Main(string[] args)
        {
            MongodbHelper<Person> helper = new MongodbHelper<Person>();

//修改jack941改成mary
            var single = helper.Single(i => i.Name == "jack941");
            single.Name = "mary";
            helper.Update(single, i => i.ID == single.ID);

Console.WriteLine("修改成功");
            Console.Read();
        }

<3>Delete:  删除mary这条记录

代码如下:

static void Main(string[] args)
        {
            MongodbHelper<Person> helper = new MongodbHelper<Person>();

//删除mary这个记录
            helper.Delete(i => i.Name == "mary");

Console.WriteLine("删除成功");
            Console.Read();
        }

<4> list操作: 这里我获取一下名字里面带9的人数列表

代码如下:

static void Main(string[] args)
        {
            MongodbHelper<Person> helper = new MongodbHelper<Person>();

int pagecount;

//获取名字里面带9的人数
            var list = helper.List(1, 20, i => i.Name.Contains("9"), out pagecount);

Console.Read();
        }

总的运行代码

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Linq.Expressions;

using MongoDB.Configuration;
using MongoDB.Linq;
using MongoDB.Attributes;

namespace MongoDB.Test
{
    public class MongodbHelper<T> where T : class
    {
        string connectionString = string.Empty;

string databaseName = string.Empty;

string collectionName = string.Empty;

static MongodbHelper<T> mongodb;

#region 初始化操作
        /// <summary>
/// 初始化操作
/// </summary>
        public MongodbHelper()
        {
            connectionString = "Server=127.0.0.1:2222";
            databaseName = "shopex";
            collectionName = "person";
        }
        #endregion

#region 实现linq查询的映射配置
        /// <summary>
/// 实现linq查询的映射配置
/// </summary>
        public MongoConfiguration configuration
        {
            get
            {
                var config = new MongoConfigurationBuilder();

config.Mapping(mapping =>
                {
                    mapping.DefaultProfile(profile =>
                    {
                        profile.SubClassesAre(t => t.IsSubclassOf(typeof(T)));
                    });
                    mapping.Map<T>();
                    mapping.Map<T>();
                });

config.ConnectionString(connectionString);

return config.BuildConfiguration();
            }
        }
        #endregion

#region 插入操作
        /// <summary>
/// 插入操作
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
        public void Insert(T t)
        {
            using (Mongo mongo = new Mongo(configuration))
            {
                try
                {
                    mongo.Connect();

var db = mongo.GetDatabase(databaseName);

var collection = db.GetCollection<T>(collectionName);

collection.Insert(t, true);

mongo.Disconnect();

}
                catch (Exception)
                {
                    mongo.Disconnect();
                    throw;
                }
            }
        }
        #endregion

#region 更新操作
        /// <summary>
/// 更新操作
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
        public void Update(T t, Expression<Func<T, bool>> func)
        {
            using (Mongo mongo = new Mongo(configuration))
            {
                try
                {
                    mongo.Connect();

var db = mongo.GetDatabase(databaseName);

var collection = db.GetCollection<T>(collectionName);

collection.Update<T>(t, func, true);

mongo.Disconnect();

}
                catch (Exception)
                {
                    mongo.Disconnect();
                    throw;
                }
            }
        }
        #endregion

#region 获取集合
        /// <summary>
///获取集合
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
        public List<T> List(int pageIndex, int pageSize, Expression<Func<T, bool>> func, out int pageCount)
        {
            pageCount = 0;

using (Mongo mongo = new Mongo(configuration))
            {
                try
                {
                    mongo.Connect();

var db = mongo.GetDatabase(databaseName);

var collection = db.GetCollection<T>(collectionName);

pageCount = Convert.ToInt32(collection.Count());

var personList = collection.Linq().Where(func).Skip(pageSize * (pageIndex - 1))
                                                   .Take(pageSize).Select(i => i).ToList();

mongo.Disconnect();

return personList;

}
                catch (Exception)
                {
                    mongo.Disconnect();
                    throw;
                }
            }
        }
        #endregion

#region 读取单条记录
        /// <summary>
///读取单条记录
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
        public T Single(Expression<Func<T, bool>> func)
        {
            using (Mongo mongo = new Mongo(configuration))
            {
                try
                {
                    mongo.Connect();

var db = mongo.GetDatabase(databaseName);

var collection = db.GetCollection<T>(collectionName);

var single = collection.Linq().FirstOrDefault(func);

mongo.Disconnect();

return single;

}
                catch (Exception)
                {
                    mongo.Disconnect();
                    throw;
                }
            }
        }
        #endregion

#region 删除操作
        /// <summary>
/// 删除操作
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
        public void Delete(Expression<Func<T, bool>> func)
        {
            using (Mongo mongo = new Mongo(configuration))
            {
                try
                {
                    mongo.Connect();

var db = mongo.GetDatabase(databaseName);

var collection = db.GetCollection<T>(collectionName);

//这个地方要注意,一定要加上T参数,否则会当作object类型处理
//导致删除失败
                    collection.Remove<T>(func);

mongo.Disconnect();

}
                catch (Exception)
                {
                    mongo.Disconnect();
                    throw;
                }
            }
        }
        #endregion
    }

#region 数据实体
    /// <summary>
/// 数据实体
/// </summary>
    public class Person
    {
        [MongoAlias("_id")]
        public string ID { get; set; }

public string Name { get; set; }

public int Age { get; set; }

public DateTime CreateTime { get; set; }
    }
    #endregion
}

时间: 2014-08-15

MongoDB入门教程之Windows下的MongoDB数据库安装图解

关于mongodb的好处,优点之类的这里就不说了,唯一要讲的一点就是mongodb中有三元素:数据库,集合,文档,其中"集合" 就是对应关系数据库中的"表","文档"对应"行".  一: 下载 上MongoDB官网 ,我们发现有32bit和64bit,这个就要看你系统了,不过这里有两点注意: ①:根据业界规则,偶数为"稳定版"(如:1.6.X,1.8.X),奇数为"开发版"(如:1.7.

MongoDB入门教程之主从复制配置详解

从这一篇开始我们主要讨论mongodb的部署技术. 我们知道sql server能够做到读写分离,双机热备份和集群部署,当然mongodb也能做到,实际应用中我们不希望数据库采用单点部署, 如果碰到数据库宕机或者被毁灭性破坏那是多么的糟糕.  一:主从复制 1: 首先看看模型图   2: 从上面的图形中我们可以分析出这种架构有如下的好处: <1>  数据备份. <2>  数据恢复. <3>  读写分离.  3:下面我们就一一实践 实际应用中我们肯定是多服务器部署,限于自

MongoDB快速入门笔记(六)之MongoDB删除文档操作

MongoDB是一个跨平台,面向文档的数据库,提供高性能,高可用性和易于扩展.MongoDB是工作在集合和文档上一种概念. 文档是一组键值对.文档具有动态模式.动态模式是指,在同一个集合的文件不必具有相同一组集合的文档字段或结构,并且相同的字段可以保持不同类型的数据. db.集合名称.remove({query}, justOne) query:过滤条件,可选 justOne:是否只删除查询到的第一条数据,值为true或者1时,只删除一条数据,默认为false,可选. 准备数据:把_id为1和2

MongoDB中javascript脚本编程简介和入门实例

注:作者使用的mongodb版本为2.4.7. 入门例子 复制代码 代码如下: conn = new Mongo();db = conn.getDB("db-name");  //选择数据库db.auth("user-name","password");  //用户验证 var map = function() {    split_result = this.sentence.split(" ");    for (var

MongoDB修改、删除文档的域属性实例

由于本博使用的博客程序是边开发边使用的,所以开发过程中动态创建了某些现在不需要的属性 MongoDB 是无 Schema 的,不像关系数据库那样列属性定义在表而非记录中,MongoDB 的集合中的每个文档可以拥有各自不同的域属性. MongoDB 中使用 db.collections.update 修改集合中若干文档的域属性,使用 $set 增加域,$unset 删除域. 删除集合中所有文档的一个域 复制代码 代码如下: db.posts.update({}, { $unset: { delet

MongoDB入门教程(包含安装、常用命令、相关概念、使用技巧、常见操作等)

一.安装和配置   MongoDB 的官方下载站是 http://www.mongodb.org/downloads,可以去上面下载最新的安装程序   Windows 平台的安装   ● 步骤一: 下载 MongoDB     点击上方官方下载地址, 并下载 Windows 版本 ● 步骤二: 设置 MongoDB 程序存放目录     下载完成后, 解压到自定义文件夹,例: D:\mongodb\ ● 步骤三: 设置数据文件存放目录     在 D:\mongodb\ 目录下创建 db 和 l

MongoDB 快速入门

对 MongoDb 文档数据库感兴趣,要安装认识下. 到官方下载 win 版 http://www.mongodb.org/display/DOCS/Downloads 目前最新稳定版是 1.2.4.解压到 f:/sofr/mongodb-win32-i386-1.2.4. 启动 mongod 复制代码 代码如下: F:\soft\mongodb-win32-i386-1.2.4>bin\mongod.exe --dbpath=f:/mongodb Mon Mar 08 11:13:17 Mon

MongoDB快速入门笔记(八)之MongoDB的java驱动操作代码讲解

MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,Mongo有个内置的连接池(池大小默认为10个). 下面代码给大家介绍MongoDB的java驱动操作,具体代码如下所示: import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.bson.Document; import com.mongodb.MongoClient; impo

MongoDB快速入门笔记(二)之MongoDB的概念及简单操作

MongoDB是面向集合的文档式数据库,不像关系数据库那样,有表,列.行,mongoDB数据库则是由一系列的文档组成.下面给大家介绍MongoDB的概念及简单操作. 1.以下列举普通的关系型数据库和MongoDB数据库简单概念上的区别: 2.MongoDB的简单操作 (1)启动MongoDB数据库之后,使用命令mongo,显示如下,默认连接到test数据库. MongoDB shell version: 3.2.6 connecting to: test 使用命令show dbs,可以查看所有的

MongoDB快速入门笔记(一)之windows下安装MongoDB方法

MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. MongoDB下载地址:http://www.mongodb.org/downloads 1.安装MongoDB 从MongoDB官网上下载MongoDB,我下载的版本是64位的3.2.6.下载完以后直接安装,我的安装目录是D:\work\MongoDB.

MongoDB快速入门笔记(四)之MongoDB查询文档操作实例代码

MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 下面给大家介绍MongoDB查询文档操作的实例 先把student删除,再重新插入数据 > db.student.drop() true > db.student.insert([{ "_id" : 1, "

MongoDB快速入门笔记(三)之MongoDB插入文档操作

MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 本文给大家介绍MongoDB的插入文档的方法,一起看看吧 1.文档的数据存储格式为BSON,类似于JSON.MongoDB插入数据时会检验数据中是否有"_id",如果没有会自动生成. shell操作有insert和save两种方法.当插入一条数据有

NodeJS中的MongoDB快速入门详细教程

MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 一.MongoDB必须理解的概念 1.数据库:每个数据库都有自己的权限和集合. 2.文档:一个键值对. 3.集合:一组文档,即一组键值对.当第一个文档插入时,集合就会被创建. 二.Mac下的MongoDB安装和启动 1.使用brew进行安装:brew ins

MongoDB快速入门笔记(七)MongoDB的用户管理操作

MongoDB 简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 1.修改启动MongoDB时要求用户验证 加参数 --auth 即可. 现在我们把MongoDB服务删除,再重新添加服务 复制代码 代码如下: mongod --dbpath "D:\work\MongoDB\data" --

MongoDB快速入门笔记(六)之MongoDB的文档修改操作

MongoDB MongoDB 是一个开源的文档数据库,并领先的 NoSQL 数据库. MongoDB 是由 c++语言编写. 文档 文档是一组键 - 值对.文件动态模式.动态模式是指,在相同集合中的文档不需要具有相同的字段或结构组的公共字段的集合的文档,可以容纳不同类型的数据. db.集合名称.update({query},{update},upsert, multi}) query:过滤条件 update:修改内容 upsert:如果不存在查询条件查出的记录,是否插入一条数据,默认是fals