MongoDB基础入门003--使用官方驱动操作mongo,C#
本篇先简单介绍一下,使用官方驱动来操作MongoDB。至于MongoDB原生的增删改查语句,且等以后再慢慢学习。
一、操作MongoDB的驱动主要有两个
1.官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads,更新的还是比较及时的,目前已经支持大部门linq语法。
2.samus驱动:https://github.com/samus/mongodb-csharp/downloads。 这个好像很久都没有更新了,估计是被抛弃了吧。(ps:据说之前使用起来很是nb啊)
驱动的下载:一种方法是,直接使用上面的连接下载。使用vs开发的同学都懂,我们强大的vs有个软件包管理工具(nuget),使用起来非常舒服。现在就介绍如何使用nuget,来安装MongoDB的驱动程序吧。
打开nuget,输入mongo,安装上MongoDB.Driver,mongocsharpdriver即可。请看下图:

二、增删改查操作。
1.新增
static void Main(string[] args)
{
string connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString);
var database = client.GetDatabase("local");
var collection = database.GetCollection<person>("person"); //批量插入1000条数据
for (int i = ; i < ; i++)
{
person p = new person();
p.age = i % + ;
p.createTime = DateTime.Now;
p.name = "rj" + i; collection.InsertOne(p);
} Console.ReadKey();
}
新增1000条数据
2.查询
//根据条件取出一条
var find1 = collection.Find(item => item.name == "rj0").FirstOrDefault();
//取出指定页数
var find2 = collection.AsQueryable().Skip().Take().ToList();
查询
3.修改(ps:Builders<T>是很强大的)
//修改
var query = Builders<person>.Filter.Where(item => item.name == "rj0"); var set = Builders<person>.Update.Set(item => item.name, "abc"); collection.FindOneAndUpdate<person>(query, set);
4.删除
collection.FindOneAndDelete(item => item.name == "abc");
三、基本的增删改查已经演示,下面上传一份整理的MongoDBHelper类。
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using MongoDB.Driver.Linq;
using MongoDB.Bson;
using System.Configuration; namespace MyMongoDB2
{
public class MongoDBHelper
{
private static readonly string connectionString = "mongodb://admin:admin@localhost";// ConfigurationManager.AppSettings["mongodbServerList"]; MongoClientSettings setting = null;
MongoServer server = null; private string databaseName = "test";// string.Empty; private string tableName = "person";//string.Empty; #region 构造函数重载
/// <summary>
/// 默认开启
/// </summary>
public MongoDBHelper() : this(true) { } /// <summary>
/// 默认副本级,指定连接串可实现单个mongodb
/// </summary>
public MongoDBHelper(bool replica) : this(replica, connectionString) { } /// <summary>
/// 默认副本级,指定连接串可实现单个mongodb
/// </summary>
public MongoDBHelper(bool replica, string conn) : this(replica, conn, string.Empty, string.Empty) { } public MongoDBHelper(bool replica, string conn, string databasename)
: this(replica, conn, databasename, string.Empty)
{ } public MongoDBHelper(string databasename, string tablename)
: this(true, connectionString, databasename, tablename)
{ } public MongoDBHelper(string databasename)
: this(databasename, string.Empty)
{ } public MongoDBHelper(bool replica, string conn, string databasename, string tablename)
{
//副本集
if (replica)
{
var ips = conn.Split(';'); var servicesList = new List<MongoServerAddress>(); foreach (var ip in ips)
{
var host = ip.Split(':')[];
var port = Convert.ToInt32(ip.Split(':')[]); servicesList.Add(new MongoServerAddress(host, port));
} setting = new MongoClientSettings()
{
ReplicaSetName = "datamip",
Servers = servicesList
}; server = new MongoClient(setting).GetServer();
}
else
{
//普通的mongodb实例
server = new MongoClient(conn).GetServer();
} this.databaseName = databasename;
this.tableName = tablename;
}
#endregion #region 删除操作 public bool Remove<T>(Expression<Func<T, bool>> func) => Remove<T>(databaseName, tableName, func); public bool Remove<T>(string table, Expression<Func<T, bool>> func) => Remove<T>(databaseName, table, func); public bool Remove<T>(string database, string table, Expression<Func<T, bool>> func)
{
try
{
var db = server.GetDatabase(database); var collection = db.GetCollection<T>(table); var query = Query<T>.Where(func); var result = collection.Remove(query); return Convert.ToInt32(Convert.ToDouble(result.Response["ok"].RawValue)) > ;
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("Remove 失败: {0} ", ex.Message), ex);
return false;
}
} public bool RemoveAll<T>() => RemoveAll<T>(databaseName, tableName); public bool RemoveAll<T>(string table) => RemoveAll<T>(databaseName, table); public bool RemoveAll<T>(string database, string table)
{
try
{
var db = server.GetDatabase(database); var collection = db.GetCollection<T>(table); var result = collection.RemoveAll(); return Convert.ToInt32(Convert.ToDouble(result.Response["ok"].RawValue)) > ;
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("Remove 失败: {0} ", ex.Message), ex);
return false;
}
} #endregion #region 插入操作
public bool Insert<T>(T t) => Insert<T>(databaseName, tableName, t); public bool Insert<T>(string table, T t) => Insert<T>(databaseName, table, t); public bool Insert<T>(string database, string table, T t)
{
try
{
var db = server.GetDatabase(database); //mongodb中的数据库 var collection = db.GetCollection<T>(table); var result = collection.Insert(t); return Convert.ToInt32(Convert.ToDouble(result.Response["ok"].RawValue)) > ;
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("Insert 失败: {0} ", ex.Message), ex);
return false;
}
}
#endregion #region Save操作 【存在就更新,不存在就插入】
public bool Save<T>(T t) => Save<T>(databaseName, tableName, t); public bool Save<T>(string table, T t) => Save<T>(databaseName, table, t); public bool Save<T>(string database, string table, T t)
{
try
{
var db = server.GetDatabase(database); //mongodb中的数据库 var collection = db.GetCollection<T>(table); var result = collection.Save(t); return Convert.ToInt32(Convert.ToDouble(result.Response["ok"].RawValue)) > ;
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("Save 失败: {0} ", ex.Message), ex);
return false;
}
}
#endregion #region 批量插入 public bool InsertBulk<T>(IEnumerable<T> list) => InsertBulk(tableName, list); public bool InsertBulk<T>(string table, IEnumerable<T> list) => InsertBulk<T>(databaseName, table, list); public bool InsertBulk<T>(string database, string table, IEnumerable<T> list)
{
try
{
//如果不判断count,mongodb会抛出异常,所以这里加上一个判断
if (list == null || list.Count() == ) return true; var db = server.GetDatabase(database); //mongodb中的数据库 var collection = db.GetCollection<T>(table); collection.InsertBatch(list); return true;
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("InsertBulk 失败: {0} ", ex.Message), ex); return false;
}
} #endregion #region 查找操作 public List<T> Find<T>(Expression<Func<T, bool>> func) => Find<T>(tableName, func); public List<T> Find<T>(string table, Expression<Func<T, bool>> func) => Find<T>(databaseName, table, func); public List<T> Find<T>(string database, string table, Expression<Func<T, bool>> func)
{
var list = new List<T>(); try
{
var db = server.GetDatabase(database); //mongodb中的数据库 var collection = db.GetCollection<T>(table); list = collection.Find(Query<T>.Where(func)).ToList();
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("Find 失败: {0} ", ex.Message), ex); throw;
} return list;
} public T FindOne<T>(Expression<Func<T, bool>> func) => FindOne<T>(tableName, func); public T FindOne<T>(string table, Expression<Func<T, bool>> func) => FindOne<T>(databaseName, table, func); public T FindOne<T>(string database, string table, Expression<Func<T, bool>> func)
{
var t = default(T); try
{
var db = server.GetDatabase(database); //mongodb中的数据库 var collection = db.GetCollection<T>(table); t = collection.FindOne(Query<T>.Where(func));
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("FindOne 失败: {0} ", ex.Message), ex); throw;
} return t;
} #endregion #region 查找并删除 【只能查找找匹配的第一条】,找到就删除 public T FindOneAndRemove<T>(Expression<Func<T, bool>> func)
=> FindOneAndRemove(databaseName, tableName, func); public T FindOneAndRemove<T>(string table, Expression<Func<T, bool>> func)
=> FindOneAndRemove(databaseName, table, func); public T FindOneAndRemove<T>(string database, string table, Expression<Func<T, bool>> func)
{
T t = default(T); try
{
var db = server.GetDatabase(database); //mongodb中的数据库 var collection = db.GetCollection<T>(table); FindAndRemoveArgs args = new FindAndRemoveArgs(); args.Query = Query<T>.Where(func); var findAndModifyResult = collection.FindAndRemove(args); t = findAndModifyResult.GetModifiedDocumentAs<T>();
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("SearchAndRemove 失败: {0} ", ex.Message), ex);
} return t;
} #endregion #region 目前支持修改一个参数,找到并修改 public T FindOneAndModify<T, A>(Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
=> FindOneAndModify(databaseName, tableName, func, arg1key, arg1value); public T FindOneAndModify<T, A>(string table, Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
=> FindOneAndModify(databaseName, table, func, arg1key, arg1value); public T FindOneAndModify<T, A>(string database, string table, Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
{
T t = default(T); try
{
var db = server.GetDatabase(database); //mongodb中的数据库 var collection = db.GetCollection<T>(table); FindAndModifyArgs args = new FindAndModifyArgs(); args.Query = Query<T>.Where(func); args.Update = Update<T>.Set<A>(arg1key, arg1value); var findAndModifyResult = collection.FindAndModify(args); t = findAndModifyResult.GetModifiedDocumentAs<T>();
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("SearchOneAndModify 失败: {0} ", ex.Message), ex);
} return t;
}
#endregion #region 更新记录 /// <summary>
/// 已指定“批量更新”
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="A"></typeparam>
/// <param name="func"></param>
/// <param name="arg1key"></param>
/// <param name="arg1value"></param>
/// <returns></returns>
public bool Modify<T, A>(Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
=> Modify<T, A>(databaseName, tableName, func, arg1key, arg1value); /// <summary>
/// 已指定“批量更新”
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="A"></typeparam>
/// <param name="table"></param>
/// <param name="func"></param>
/// <param name="arg1key"></param>
/// <param name="arg1value"></param>
/// <returns></returns>
public bool Modify<T, A>(string table, Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
=> Modify<T, A>(databaseName, table, func, arg1key, arg1value); /// <summary>
/// 已指定“批量更新”
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="A"></typeparam>
/// <param name="database"></param>
/// <param name="table"></param>
/// <param name="func"></param>
/// <param name="arg1key"></param>
/// <param name="arg1value"></param>
/// <returns></returns>
public bool Modify<T, A>(string database, string table, Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
{
try
{
var db = server.GetDatabase(database); //mongodb中的数据库 var collection = db.GetCollection<T>(table); var query = Query<T>.Where(func); var update = Update<T>.Set(arg1key, arg1value); var writeConcernResult = collection.Update(query, update, UpdateFlags.Multi); return writeConcernResult.DocumentsAffected > ;
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("Exists 失败: {0} ", ex.Message), ex); throw;
}
} #endregion #region 查询所有数据 public List<T> FindAll<T>() => FindAll<T>(databaseName, tableName); public List<T> FindAll<T>(string table) => FindAll<T>(databaseName, table); public List<T> FindAll<T>(string database, string table)
{
var list = new List<T>(); try
{
var db = server.GetDatabase(database); //mongodb中的数据库 var collection = db.GetCollection<T>(table); list = collection.FindAll().ToList(); return list;
}
catch (Exception ex)
{
//LogHelper.WriteLog(string.Format("FindAll 失败: {0} ", ex.Message), ex); return list;
}
}
#endregion #region 删除数据库/表
public void Drop(MlevelEnum mlevel, string database = null, string table = null)
{
var tempdatabase = database ?? databaseName; var temptable = table ?? tableName; try
{
if (mlevel == MlevelEnum.tableName)
{
var db = server.GetDatabase(tempdatabase); db.DropCollection(temptable);
}
else
{
server.DropDatabase(tempdatabase);
}
}
catch (Exception ex)
{
//LogHelper.WriteLog("DropDatabase失败", ex);
}
} public CommandResult DropDataBaseOrTable(MlevelEnum mlevel, string database = null, string table = null)
{
BsonDocument response = new BsonDocument(); CommandResult result = new CommandResult(response); var tempdatabase = database ?? databaseName; var temptable = table ?? tableName; try
{
if (mlevel == MlevelEnum.tableName)
{
var db = server.GetDatabase(tempdatabase); return db.DropCollection(temptable);
}
else
{
return server.DropDatabase(tempdatabase);
}
}
catch (Exception ex)
{
//LogHelper.WriteLog("DropDatabase失败", ex);
} return result;
} #endregion } public enum MlevelEnum
{
databaseName = ,
tableName =
}
}
MongoDBHelper
MongoDB基础入门003--使用官方驱动操作mongo,C#的更多相关文章
- 使用Mongo官方驱动操作Mongo数据库
首先到 https://github.com/mongodb/mongo-csharp-driver/downloads 下载Mongo官方驱动 下载完成后引用到项目中 public class Co ...
- [转载]在C#中使用官方驱动操作MongoDB
在C#中使用官方驱动操作MongoDB 8.1)下载安装 想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类 ...
- windows下mongodb基础玩法系列二CURD操作(创建、更新、读取和删除)
windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...
- MongoDB基础入门视频教程
MongoDB基础入门视频教程http://www.icoolxue.com/album/show/98
- 在C#中使用官方驱动操作MongoDB
MongoDB的官方驱动下载地址:https://github.com/mongodb/mongo-csharp-driver/releases 目前最新的版本是2.10,支持.NET 4.5以上.由 ...
- 使用MongoDB C#官方驱动操作MongoDB
想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...
- C#中使用官方驱动操作MongoDB
想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...
- C#/.NET 使用官方驱动操作MongoDB(一):插入、查询
概述 想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动. C#版的驱动有很多,这里我们先用官方提供的 MongoDB.Driver(使用 Nuget 安装),当前版本为2. ...
- MongoDB基础入门002--基本操作,增删改查
一.这里只是演示最基本的操作,更多的信息可以去官网.https://docs.mongodb.com/manual 打开一个cmd,输入mongo命令打开shell,其实这个shell就是mongod ...
随机推荐
- hibernate学习笔记之四 Hibernate的增删改查
采用JUnit测试,继承TestCase import java.util.Date; import junit.framework.TestCase; import org.hibernate.Se ...
- Js replace() 学习笔记
最近捣鼓着学习Js,发现replace()真的很有用,替换功能杠杠的棒. 接下来看看我遇到的问题: 有两个随机给出的字符串,字符串1'xxxxxx',字符串2'====T'(这两个用作示例,其他为随机 ...
- 使用hexo搭建github.io博客(一)
使用github.io可以搭建一个自己的博客,把静态文件项目托管到github上,可以写博客,可以使用markdown语法,也可以展示作品.灵活性高.但是有较大的难度. node,git版本变化日新月 ...
- 【非愚人】重要通知:04-01 贴吧继PHP资源之后又。。。
贴吧继PHP资源之后又取消了JAVA,IOS等资源的贴,现在专注于Net,C++,Linux,平面设计.主要是为了让广大Net程序员具备全栈全平台牛人的潜力,故而取消那些干扰因素.Net的潜力和活力大 ...
- LINQ系列:Linq to Object排序操作符
LINQ排序操作符包括:OrderBy.OrderByDescending.ThenBy.ThenByDescending及Reverse. 1. OrderBy 1>. 原型定义 public ...
- php的mysql\mysqli\PDO(二)mysqli
原文链接:http://www.orlion.ga/1147/ mysqli有面向对象风格和面向过程风格,个人感觉还是用面向对象风格比较好(毕竟是面向对象) 1.mysqli::_construct( ...
- Android开发之Toast
第一次在博客园发布文章,就把我刚弄明白的关于Android开发中的提示设置,分享给大家. Toast是Android中经常用到的一个方法,用于简单的用户提示,经过摸索我发现了Toast的两种使用方式, ...
- Python补充06 Python之道
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python有一个彩蛋,用下面语句调出: import this 该彩蛋的文档记录 ...
- 修改ibdata1大小的验证以及如何使用mysqld_multi管理多实例
修改ibdata1大小的验证 ibdata是共享表空间,在MySQL初始化的时候就生成了. 但很多童鞋会看到网上各种大神的调优建议,在MySQL已经初始化的情况下,修改配置文件中innodb_data ...
- Java 8 Stream API详解--转
原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...