C#MongoDB使用实践
9.5更新:更方便的启动命令
1)在D:\MongoDB中新建mongo.config文件,内容为
#启动mongod:mongod.exe --bind_ip 127.0.0.1 --logpath D:\MongoDB\Logs\mongodb.log --logappend --dbpath D:\MongoDB\db --service
#或安装为服务:mongod --config D:\mongodb\mongo.config --service
#SC方式安装服务:sc create mongodb binPath= "D:\MongoDB\Server\3.2\bin\mongod.exe --service --config=D:\MongoDB\mongo.config"
#auth=true ## 是否启用权限控制
dbpath=D:\MongoDB\db ## 数据文件路径
logpath=D:\MongoDB\Logs\mongodb.log ## 日志文件路径
logappend=true ## 是否
journal=true ## 是否启用日志文件
bind_ip=127.0.0.1 ## 绑定本机ip仅允许本机访问
port=27017 ## 绑定端口
2)在D:\MongoDB\Logs中建立mongodb.log保存日志
3)运行“D:\MongoDB\Server\3.2\bin\mongod.exe --config D:\mongodb\mongo.config --service”创建服务(需要修改服务可以使用sc delete servername删除服务)
--------------------------------------------------------------------------------------------------------------------------
8.24更新:
再分享一个网友的MongoDB项目例子,里面代码很清晰,注意下里面的驱动版本~
http://download.csdn.net/detail/yyl8781697/5335249
--------------------------------------------------------------------------------------------------------------------------
8.12更新:
找到一个第三方封装组件: MongoRepository,最新支持官方驱动1.11.0,并很好的支持LinQ,开发者写的文档也很详细,推荐使用~
NuGet地址:https://www.nuget.org/packages/MongoRepository/
GitHub:https://github.com/RobThree/MongoRepository
入门文档:https://github.com/RobThree/MongoRepository/wiki/Documentation
--------------------------------------------------------------------------------------------------------------------------
最近项目要求做一个主要业务的操作日志,保存后供追溯查询。由于需要较高的写入性能,且不用繁琐的关系存储,思来想去nosql适合。
在比较redis和mongodb后决定采用后者,原因只有一个,后者支持方便的条件查询……
1、先说环境搭建(Windows 10),先进入官网https://www.mongodb.com/download-center?jmp=nav#community下载最新的3.2版本,是否需要with SSL看项目需求。
2、下载完成直接点击安装,安装完成后:
1):手动创建dbpath路径
2):将mongodb安装为service,以admin权限启动cmd输入命令:
mongod.exe --bind_ip 127.0.0.1 --logpath "D:\MongoDB\dbConf\mongodb.log" --logappend --dbpath "D:\MongoDB\db" --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install
其中, bind_ip:指定访问数据的主机ip,这里仅限本地;
logpath:log文件路径,自主指定;
logappend:追加形式写log;
dbpath:即上面创建好的dbpath;
serviceName:服务名称;
serviceDisplayName;显示的服务名称;
3)、启动服务:net start MongoDB
3、进入安装目录运行mongo即可打开console,常用命令:
Show dbs-------所有数据库
Use [dbname] -------进入指定数据库
Show collections-------显示所有集合(相当于tsql的table)
Db.[collectionname].find()-------查询集合所有数据
Db.[collectionname].drop()-------删除集合,如果当前只有一个集合,那么将删除db
其他命令可分别使用db.help()和db.[collectionname].help()查询
4、环境配置完毕,添加驱动,这里使用的是官方最新1.11版,可以在VisualStudio中使用NuGet工具直接添加:
1)在NuGet中搜索mongodb,请选择第二个mongocsharpdriver;
2)添加完毕后会多出两个dll:MongoDB.Driver.dll和MongoDB.Bson.XML;
3)官方1.x和2.x驱动的api是不同的,要注意。
5、驱动使用方法见如下provider,由于业务层使用了泛型,这里用了比较多的判断:
using _5yue.Common;
using _5yue.Models;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _5yue.Data.MongoDB
{
public class MongoDBProvider
{
private static string serverAddress = "mongodb://localhost:27017";
private static string mongoDbName = "db_name"; //private MongoServer server;
private MongoClient client = null;
private MongoDatabase database = null;
private MongoCollection collection = null; public MongoDBProvider(string collectionName)
{
if (collection == null)
{
client = new MongoClient(serverAddress);// 打开连接
database = client.GetServer().GetDatabase(mongoDbName);// 打开数据库
collection = database.GetCollection(collectionName);// 打开集合(相当于表)
}
else if (!collection.Name.Equals(collectionName))
{
collection = database.GetCollection(collectionName);// 更换集合
}
} #region 插入
public void InsertObj<T>(T document)// 单条
{
collection.Insert<T>(document);
}
public void InsertBson(BsonDocument bDoc)// 插入单条bson
{
collection.Insert(bDoc);
}
public void InsertObjList<T>(IList<T> objs)// 多条
{
collection.InsertBatch<T>(objs);
} #endregion #region 查询
public MongoCursor<T> GetAll<T>()
{
return collection.FindAllAs<T>();
} /// <summary>
/// 通过条件获取结果
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="user"></param>
/// <param name="entityId"></param>
/// <param name="minTime"></param>
/// <param name="maxTime"></param>
/// <returns></returns>
public MongoCursor<T> GetByCondition<T>(OperateLogModel olModel)
{
if (olModel != null && parameterNameList != null && parameterNameList.Count > )
{
List<IMongoQuery> list = new List<IMongoQuery>();
list.Add(Query.EQ("paras", olModel.operatorId));// paras:db中存放的字段,olModel.operatorId: 传过来的查询条件
if (list.Count > )
{
var query = Query.And(list);// 条件连接
//return collection.FindAs<T>(Query.EQ("CreaterId", 2));
return collection.FindAs<T>(query);
}
else
{
return collection.FindAllAs<T>();
}
}
else return null;
} #endregion #region 工具
public void ChangeCollection(string collectionName)
{
collection = database.GetCollection(collectionName);
} public MongoDatabase GetDB()
{
return database == null ? database : null;
}
public MongoCollection GetCollection()
{
return collection == null ? collection : null;
} /// <summary>
/// 把MongoCursor转换成List类型
/// </summary>
/// <param name="cursor">文档游标</param>
/// <returns></returns>
public List<T> CursorToList<T>(MongoCursor<T> cursor)
{
List<T> resultList = new List<T>();
cursor.GetEnumerator().MoveNext();// 设置游标
if(cursor.Count() > )
{
foreach (var obj in cursor)// 遍历
{
resultList.Add(obj);
}
}
return resultList;
}
#endregion
}
}
点击显示
6、业务类:
using _lbh.Models;
using _lbh.Data.MongoDB;
using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using _lbh.Common; namespace _lbh.DataProvider
{
/// <summary>
/// 操作日志
/// </summary>
public class OperateLog : BaseProvider
{
public static MongoDBProvider mDBProvider = null; /// <summary>
/// 初始化mongoDB
/// </summary>
/// <param name="collectionName">集合名称</param>
public static void InitMongoDB(string collectionName)
{
if (mDBProvider == null)// 为空就初始化
{
mDBProvider = new MongoDBProvider(collectionName);
}
else if (!collectionName.Equals(mDBProvider.GetCollection()))// 如不是当前集合
{
mDBProvider.ChangeCollection(collectionName);// 修改为当前集合
}
} #region 插入
/// <summary>
/// 直接插入实体对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="collectionName"></param>
public static void Insert<T>(T obj, string collectionName)
{
InitMongoDB(collectionName);
mDBProvider.InsertObj<T>(obj);
} /// <summary>
/// 直接插入对象列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="objList"></param>
/// <param name="collectionName"></param>
public static void InsertList<T>(List<T> objList, string collectionName)
{
InitMongoDB(collectionName);
mDBProvider.InsertObjList<T>(objList);
} #endregion #region 查询
/// <summary>
/// 获取指定集合的所有数据,无论是否Bson形式
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <returns></returns>
public static List<T> GetAll<T>(OperateLogModel model)
{
if (model == null || Utils.StrIsNullOrEmpty(model.collectionName))
{
return null;
}
InitMongoDB(model.collectionName);
MongoCursor<T> result = mDBProvider.GetAll<T>();
List<T> resultList = mDBProvider.CursorToList<T>(result);
return resultList;
} /// <summary>
/// 指定条件查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <returns></returns>
public static List<T> GetLByCondition<T>(OperateLogModel model)
{
if (model == null || Utils.StrIsNullOrEmpty(model.collectionName))
{
return null;
}
InitMongoDB(model.collectionName);
MongoCursor<T> result = mDBProvider.GetByCondition<T>(model);// 获取查询结果
List<T> resultList = mDBProvider.CursorToList<T>(result);// 数据结构转换
return resultList;
}
#endregion
}
}
点击显示
7、条件Model定义:
// 这是查询用的条件model
public class OperateLogModel
{
/// <summary>
/// 集合名称_集合为nosql存放数据的单位,相当于rdb的表
/// </summary>
public string collectionName { get; set; }
/// <summary>
/// 操作员id
/// </summary>
public int operatorId { get; set; }
/// <summary>
/// 操作员名称
/// </summary>
public string operatorName { get; set; }
/// <summary>
/// 实体对象id
/// </summary>
public string entityId { get; set; }
/// <summary>
/// 查询时间下限
/// </summary>
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime minTime { get; set; }
/// <summary>
/// 查询时间上限
/// </summary>
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime maxTime { get; set; }
}
点击打开
8、数据实体Model定义: 略
9、业务入口调用:
插入:OperateLog.InsertList<OrderModel>(pList, "OrderModel");
查询:List<OrderModel> sa = OperateLog.GetLByCondition<OrderModel>(new OperateLogModel(););
10、补充:
1)、MongoDB内部已实现了较完善的线程池,所以多数情境下不用考虑。
2)、MongoDB存储时将日期字段转为UTC标准(即比北京时间晚8小时),需要在相关Model的时间字段添加[BsonDateTimeOptions(Kind = DateTimeKind.Local)]修饰。
3)、使用官方驱动的弊端之一,实体Model中必须包含ObjectId _id字段,此字段将作为默认主键保存在库中。处理手段之一是使用collection.Insert(Bson bson)插入数据,Bson结果类似Json,db内部也是以此存取数据。
4)、想到再说……
总结,本项目中只算非常入门的使用MongoDB,至于分布式存储、同步等特性还有待挖掘,本人能力有限,如有错误欢迎指正! :)
C#MongoDB使用实践的更多相关文章
- mongodb 最佳实践
MongoDB功能预览:http://pan.baidu.com/s/1k2UfW MongoDB在赶集网的应用:http://pan.baidu.com/s/1bngxgLp MongoDB在京东的 ...
- MongoDB最佳实践中文手册
背景:查阅了一下MongoDB的相关文档,发现中文文档还是比较少的,工作中需要用到MongoDB,而这本<MongoDB最佳实践>是很好的选择,所以就把这本手册翻译了一下,其中生涩的专业用 ...
- MongoDb进阶实践之六 MongoDB查询命令详述(补充)
一.引言 上一篇文章我们已经介绍了MongoDB数据库的查询操作,但是并没有介绍全,随着自己的学习的深入,对查询又有了新的东西,决定补充进来.如果大家想看上一篇有关MongoDB查询的 ...
- MongoDB入门实践
MongoDB入门实践 简单介绍MongoDB,包括MongoDB的使用场景.和MySQL的对比.安装部署.Java客户端访问及总结 MongoDB? 我们遵循需求驱动技术的原则,通过一个场景来引入M ...
- Spring Boot开发MongoDB应用实践
本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...
- MongoDB DBA 实践7-----MongoDB的分片集群操
一.使用Ranged Sharding对集合进行分片 从mongo连接到的shell中mongos,使用该sh.shardCollection()方法对集合进行分片. 注意: 必须已为集合所在的数据库 ...
- MongoDB DBA 实践6-----MongoDB的分片集群部署
一.分片 MongoDB使用分片技术来支持大数据集和高吞吐量操作. 1.分片目的 对于单台数据库服务器,庞大的数据量及高吞吐量的应用程序对它而言无疑是个巨大的挑战.频繁的CRUD操作能够耗尽服务器的C ...
- mongodb数据库实践笔记
mongodb 操作规则 从网站上下载安装文件然后在安装目录下创建文件夹data和log创建配置文件mongo.config里面填充如下: ##数据文件dbpath=D:\mongodb\data## ...
- Redis+MongoDB 最佳实践 做到读写分离 -摘自网络
方案1. (被否定) 加上Redis,做到MongoDB的读写分离,单一进程从MongoDB及时把任务同步到Redis中. 看起来很完美,但是上线后出现了各种各样的问题,列举一下: 1.Redis队列 ...
随机推荐
- 《奥威Power-BI智能分析报告制作方法 》精彩回顾
上次课我们简单介绍了奥威Power-BI的智能分析报告,并展示了报告与图表相结合的应用场景.图文分析报表的意义不只在于美观,更重要的是固定框架下的灵活性和追根究底的动态分析,有着很强的实用性.上节课 ...
- Linux解决Device eth0 does not seem to be present
ifconfig...没有看到eth0..然后重启网卡又报下面错误. 故障现象: service network restartShutting down loopback insterface: ...
- AjaxFileUpload 方法与原理分析
AjaxFileUpload需求 传统的form表单方式上传文件, 必然会刷新整个页面. 那么在不刷新界面的情况下实现文件的上传呢? 在 HTML4下, 聪明的程序员们发明了 ajax file u ...
- 学习OpenCV——BOW特征提取函数(特征点篇)
没日没夜的改论文生活终于要告一段落了,比起改论文,学OpenCV就是一件幸福的事情.OpenCV的发展越来越完善了,已经可以直接使用BOW函数来进行对象分类了. 简单的通过特征点分类的方法: ...
- C语言回顾-运算符和循环
1.运算符 连接操作数,构成表达式 按功能划分: 1)算术运算符 + - * / % 2)关系运算符 3)逻辑运算符 4)按位运算符 按操作数划分: 1)单目运算符 2)双目运算符 3)三目运算符 ...
- Android PullToRefresh (GridView 下拉刷新上拉加载)
做这个需要自己去git hub上下载个pull-to-refresh 里面有个library为依赖包自己导到自己的项目中 (下载地址:https://github.com/chrisbanes/And ...
- nginx 设置 fastcgi缓存
#增加调试信息 add_header X-Cache-CFC "$upstream_cache_status - $upstream_response_time"; fastcgi ...
- (转) Eclipse连接MySQL数据库(傻瓜篇)
Eclipse连接MySQL数据库(傻瓜篇) 原帖地址: http://www.cnblogs.com/fnng/archive/2011/07/18/2110023.html Posted on 2 ...
- JAVA基础知识之JDBC——使用ResultSetMetaData分析结果集
通过ResultSetMetaData可以对ResultSet进行分析,获取ResultSet里包含了哪些数据列,以及每个列的数据类型. ResultSet中包含了一个getMetaData()方法, ...
- 提高mysql插入性能
参考地址:http://blog.jobbole.com/29432/ 参数优化: 1. SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_p ...