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使用实践的更多相关文章

  1. mongodb 最佳实践

    MongoDB功能预览:http://pan.baidu.com/s/1k2UfW MongoDB在赶集网的应用:http://pan.baidu.com/s/1bngxgLp MongoDB在京东的 ...

  2. MongoDB最佳实践中文手册

    背景:查阅了一下MongoDB的相关文档,发现中文文档还是比较少的,工作中需要用到MongoDB,而这本<MongoDB最佳实践>是很好的选择,所以就把这本手册翻译了一下,其中生涩的专业用 ...

  3. MongoDb进阶实践之六 MongoDB查询命令详述(补充)

    一.引言         上一篇文章我们已经介绍了MongoDB数据库的查询操作,但是并没有介绍全,随着自己的学习的深入,对查询又有了新的东西,决定补充进来.如果大家想看上一篇有关MongoDB查询的 ...

  4. MongoDB入门实践

    MongoDB入门实践 简单介绍MongoDB,包括MongoDB的使用场景.和MySQL的对比.安装部署.Java客户端访问及总结 MongoDB? 我们遵循需求驱动技术的原则,通过一个场景来引入M ...

  5. Spring Boot开发MongoDB应用实践

    本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...

  6. MongoDB DBA 实践7-----MongoDB的分片集群操

    一.使用Ranged Sharding对集合进行分片 从mongo连接到的shell中mongos,使用该sh.shardCollection()方法对集合进行分片. 注意: 必须已为集合所在的数据库 ...

  7. MongoDB DBA 实践6-----MongoDB的分片集群部署

    一.分片 MongoDB使用分片技术来支持大数据集和高吞吐量操作. 1.分片目的 对于单台数据库服务器,庞大的数据量及高吞吐量的应用程序对它而言无疑是个巨大的挑战.频繁的CRUD操作能够耗尽服务器的C ...

  8. mongodb数据库实践笔记

    mongodb 操作规则 从网站上下载安装文件然后在安装目录下创建文件夹data和log创建配置文件mongo.config里面填充如下: ##数据文件dbpath=D:\mongodb\data## ...

  9. Redis+MongoDB 最佳实践 做到读写分离 -摘自网络

    方案1. (被否定) 加上Redis,做到MongoDB的读写分离,单一进程从MongoDB及时把任务同步到Redis中. 看起来很完美,但是上线后出现了各种各样的问题,列举一下: 1.Redis队列 ...

随机推荐

  1. 命令行子shell 括号 ()

    子shell 控制变量 ansible-direc:~ # (export hello=world;echo $hello)worldansible-direc:~ # echo $hello ans ...

  2. iOS,文本输入,键盘相关

    1.UIKeyboard键盘相关知识点 2.点击空白区域隐藏键盘(UIKeyboard) 3.键盘(UIKeyboard)挡住输入框处理 4.自定义键盘(UIKeyboard) 5.监听键盘弹出或消失 ...

  3. IE8下JQuery clone 出的select元素使用append添加option异常解决记录

    遇到一个怪现象,由于配置参数是多实例的, 故采用JQuery对模板HTML代码进行clone, HTML代码中包括select标签, 在克隆之后需要对select进行添加option. 在firefo ...

  4. DOM based XSS Prevention Cheat Sheet(DOM Based XSS防御检查单)

    本文为翻译版本,原文请查看 https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet 介绍 谈到XSS攻击,有三种公认的 ...

  5. [转] 基于MySQL的秒杀核心设计(减库存部分)-防超卖与高并发

    商品详情页面的静态化,varnish加速,秒杀商品库独立部署服务器这种就略过不讲了.只讨论库存部分的优化 mysql配置层面的优化可以参考我的这篇文章 <关于mysql innodb引擎性能优化 ...

  6. cocos2dx js 3.2 热更新

    COCOS IDE用手机调试更新是正常的,是预想的结果,但用COCOS IDE打包发布APK,安装到手机上,热更新下载图片.JSON UI什么的都能正常更新替换,但JS脚本没有替换,这是为毛.更新文件 ...

  7. Java关于链表的增加、删除、获取长度、打印数值的实现

    package com.shb.java; public class Demo8 { public Node headNode = null; /** * @param args * @date 20 ...

  8. winform下的智能提示框

    winform下的智能提示框 最近在搞winform的程序,接触到有些可能以后还会用到的功能,所以写到博客园里去,第一可以加深自己的印象,第二可以在以后再遇到同样问题的时候忘记了可以马上回来看看,第三 ...

  9. JS实时数据运算

    应朋友需要制作的一个小页面 <script type="text/javascript"> function cal(ida,idb,idc,idd) { var nu ...

  10. windows环境下Django安装配置

    --python下载 https://www.python.org/downloads/ --pip 下载 https://pypi.python.org/pypi/pip --pip 安装及路径 解 ...