Mongo——C#操作
自己练手写了一个MongoDb的泛型类,顺便把一些常用命令整理了一下,做个记录:
/// <summary>
/// Mongo操作类。
/// </summary>
/// <remarks>
/// 参考:http://www.runoob.com/mongodb/mongodb-tutorial.html
/// https://docs.mongodb.com/manual/crud/
/// 命令:
/// show dbs,查看db列表;
/// show collections,查看集合;
/// use test,转换到test类;
/// 可以使用db.help()或db.[coll].help()查看相关命令,不做缀诉,下面额外提一些运维排错相关的命令。
/// 运维:
/// db.getPrevError(),查询之前的错误信息,可以通过db.resetError()来重置错误信息。
///
/// </remarks>
public class MongoDao<T> where T : class
{
private IMongoCollection<T> _tCol;
/// <summary>
/// 构造函数。
/// </summary>
/// <param name="connStr">链接字符串,格式如mongodb://[username:password@]host1[:port1],(示例:mongodb://user:123456@127.0.0.1:27017)。</param>
/// <param name="dbName">对应的数据库名称。</param>
/// <param name="colName">对应的集合名称。</param>
public MongoDao(string connStr, string dbName, string colName)
{
var mClient = new MongoClient(connStr);
_tCol = mClient.GetDatabase(dbName).GetCollection<T>(colName);
}
/// <summary>
/// 集合操作。
/// </summary>
/// <remarks>
/// 命令(列子均已Artcile集合为例,类型:{"_id":1,"User":"新用户","IP":"0.0.0.0","Title":"新标题","Content":"新内容"}):
/// db.createCollection(“Artcile”, {size: 20, capped: true, max: 10}),虽然Mongo会自动创建集合,但有时候会有特殊需要,例子中就是创建了一个
/// 大小固定的集合,这种集合的插入和按照顺序的查询速度极快,在数据插入达到阈值时会淘汰最早的数据,通常可以应用在特定场景如日志存储。
/// db.getCollection("Artcile"),获取指定集合,当然也可以通过db.Artcile这种形式操作。
/// db.getCollectionNames(),获取集合列表和show colletions的功能相似。
/// db.printCollectionStats(),查看数据集的状态,也可以使用db.Artcile.stats()来查看单个集合的状态。
/// db.ensureIndex({Title:1}),创建索引。
/// db.Article.getIndexes(),查询当前集合的所有索引,db.Article.reIndex()有类似功能。
/// db.Article.dropIndex("Title_1"),按照名称删除指定索引,页可以通过db.Article.dropIdnexes()来删除所有索引。
/// </remarks>
public IMongoCollection<T> MongoCollection
{
get { return _tCol; }
}
/// <summary>
/// 添加。
/// </summary>
/// <remarks>
/// 命令:
/// db.Article.save({"_id":1,"User":"新用户","IP":"0.0.0.0","Title":"新标题","Content":"新内容"}),添加数据,集合对于列没有固定要求,不过建议固定格式。
/// </remarks>
public void Add(T tObj)
{
var id = ObjectId.GenerateNewId();
_tCol.InsertOne(tObj);
}
/// <summary>
/// 批量添加。
/// </summary>
/// <remarks>
///
/// </remarks>
public void AddMany(List<T> tObjs)
{
_tCol.InsertMany(tObjs);
}
/// <summary>
/// 查找一个。
/// </summary>
/// <remarks>
///
/// </remarks>
public T FindOne(Expression<Func<T, bool>> filter)
{
return _tCol.Find(filter).First();
}
/// <summary>
/// 查找多个。
/// </summary>
/// <remarks>
/// 命令:
/// db.Article.find(),查找所有记录。
/// db.Article.distinct("Tilte"),相当于关系型数据库中的distinct。
/// db.Article.find({_id:1}),查找id为1的文章。
/// db.Article.find({_id:{$lt:2}}),查找id小于2的文章,以此类推,lt表示小于,gt表示大于,gte表示大于等于,lte表示小于等于。
/// db.Article.find({_id:{$lt:10,$gt:5}}),查找id小于10大于5的文章,这里的逗号表示一种and关系。
/// db.Article.find({$or:[{_id:{$lt:10}},{_id:{$gt:1990}}]}),or的关系需要用数组来表达,这个例子就表示查找id小于10或者大于1990的数据。
/// db.Article.find().sort({_id:1}).sort({_id:-1}).skip(10).limit(2),其中的sort表示排序,1表示升序,-1表示降序,skip表示跳过多少条,limit表示取多少条。
/// db.Article.findOne(),表示返回第一条数据。
/// db.Article.count(),返回集合的个数。
/// </remarks>
public List<T> FindAll(Expression<Func<T, bool>> filter)
{
return _tCol.Find(filter).ToList();
}
/// <summary>
/// 按条件删除。
/// </summary>
/// <remarks>
/// 命令:
/// db.Article.remove({_id:1})
/// </remarks>
public long Delete(Expression<Func<T, bool>> filter)
{
return _tCol.DeleteMany(filter).DeletedCount;
}
/// <summary>
/// 按条件更新一个。
/// </summary>
/// <remarks>
/// 命令:
/// db.Article.update({_id:1},{$set:{Title:"测试"}},false,true),更新数据,第三个参数表示是不存在否插入,为false表示数据不存在时不插入;第四个参数表示是否更新多个,为flase表示只更新一个。
/// db.Article.findAndModify({query:{_id:{$gte:50}},sort:{_id:-1},update:{$set:{Title:"新测试"}}}),查询修改
/// </remarks>
public long Update(Expression<Func<T, bool>> filter, T newObj)
{
return _tCol.ReplaceOne(filter, newObj).MatchedCount;
}
/// <summary>
/// 按条件更新多个。
/// </summary>
/// <remarks>
///
/// </remarks>
public void Update(Expression<Func<T, bool>> filter, Dictionary<Expression<Func<T, object>>, object> upd)
{
var fd = Builders<T>.Filter.Where(filter);
UpdateDefinition<T> ud = null;
foreach (var up in upd)
{
if (ud == null)
ud = Builders<T>.Update.Set(up.Key, up.Value);
else
ud = ud.Set(up.Key, up.Value);
}
_tCol.UpdateMany(fd, ud);
}
/// <summary>
/// Map:把一个操作Map到集合中的每一个文档
/// Shuffle:根据Key分组
/// Reduce:处理值表中的元素,直到值表中只有一个元素
/// Finalize:不是必须的,对数据进行格式化操作
/// </summary>
public void MapReduce()
{
var _mCode = @"function(){if(this._id<100){emit(this._id,{Title:this.Title})}}";
var _rCode = @"function(key,values){return JSON.stringify(values)}";
BsonJavaScript _mjs = new BsonJavaScript(_mCode);
BsonJavaScript _rjs = new BsonJavaScript(_rCode);
var mr = _tCol.MapReduce<MapType>(_mjs, _rjs).ToList();
}
}
public class MapType
{
public long _id { get; set; }
public MResult value { get; set; }
}
public class MResult
{
public string Title { get; set; }
}
Mongo——C#操作的更多相关文章
- 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查
一.开篇 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象 ...
- mongo(删除操作)
在使用MongoDB的时候,经常会用到MongoDB的删除操作,以下是我在使用MongoDB删除操作的总结 首先是删除用户: db.removeUser("用户名") 其次是删除数 ...
- mongo 高级操作
聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 管道 管道在Unix和 ...
- mongo 数据库操作
启动和关闭数据库 启动 # mongodb 默认使用执行 mongod 命令所处的盘的根目录下 /data/db 作为自己的数据存储目录 # 所以在第一次执行该命令之前先自己动手新建一个 /d ...
- laraver mongo 查询操作
1,mongo 不支持特殊where条件(&,|) 2,mongo 可以连接mysql的表查询,但不支持连表的where查询
- Mongo常用操作
设置登陆验证 进入Mongo添加用户 db.addUser('root','123456') 编辑Mongo配置文件 vi /etc/mongod.conf 找到#auth = true ...
- Mongo 常用操作
1.查询 [基本形式]db.col.find().pretty():pretty() 方法以格式化的方式来显示所有文档. [获取记录条数]:db.users.find().count(); [读取指定 ...
- Mongo数据库操作/数据库版本号
第一步,找到mongodb安装目录第二步,从命令行进入mongodb安装目录下的bin目录 附:http://www.runoob.com/mongodb/mongodb-create-databas ...
- mongo复杂操作
相比关系型数据库, Array [1,2,3,4,5] 和 Object { 'name':'DragonFire' } 是MongoDB 比较特殊的类型了 特殊在哪里呢?在他们的操作上又有什么需要注 ...
随机推荐
- java8 Stream 笔记
stream的定义:对一个源中的一系列元素进行聚合操作. 一系列元素:stream对一组有特定类型的元素提供了一个接口.但是stream并不真正存储元素,元素根据需求被计算出来. 源:stream可以 ...
- idiom的学习笔记(一)、三栏布局
三栏布局左右固定,中间自适应是网页中常用到的,实现这种布局的方式有很多种,这里我主要写五种.他们分别是浮动.定位.表格.flexBox.网格. 在这里也感谢一些老师在网上发的免费教程,使我们学习起来更 ...
- android黑科技系列——Apk的加固(加壳)原理解析和实现
一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...
- 服务器控件使用eval()绑定属性出现服务器标记的格式不正确
在使用asp.net服务器端控件的时候,想要动态绑定控件某属性的值,或者动态绑定控件事件方法的参数,例如一个<asp:RadioButton ID="RadioButton5" ...
- 移植开源QT软件-SameGame
前言: QML是一种描述性的脚本语言,文件格式以.qml结尾.语法格式非常像CSS(参考后文具体例子),但又支持javascript形式的编程控制.我个人认为它结合了QtDesigner UI和QtS ...
- PCL:解决PCL和OpenCV冲突的方法
不是PCL的问题,而是OpenCV的问题. (1):先包含PCL库,再包含OpenCV库: (2):把里面的UCHAR冲突全部换掉! 如果你有闲情逸致,用正则表达式 慢慢替换去吧! (3):或者把F ...
- Ecshop 扯淡问题
1:解决 :在 temp 文件下创建 backup文件夹 修改权限 2:待补充...
- nodejs 使用crypto实现sha256\md5加密
var crypto = require('crypto'); var hash = crypto.createHash('sha256');// sha256或者md5 hash.update('1 ...
- node中exports和module.exports的关系及使用
在node中,需要记住,在使用exports和module.exports的时候,实际输出的是module.exports. exports指向module.exports,是module.expor ...
- BZOJ 2333 [SCOI2011]棘手的操作 (可并堆)
码农题.. 很显然除了两个全局操作都能用可并堆完成 全局最大值用个multiset记录,每次合并时搞一搞就行了 注意使用multiset删除元素时 如果直接delete一个值,会把和这个值相同的所有元 ...