自己练手写了一个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#操作的更多相关文章

  1. 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查

    一.开篇 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象 ...

  2. mongo(删除操作)

    在使用MongoDB的时候,经常会用到MongoDB的删除操作,以下是我在使用MongoDB删除操作的总结 首先是删除用户: db.removeUser("用户名") 其次是删除数 ...

  3. mongo 高级操作

    聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 管道 管道在Unix和 ...

  4. mongo 数据库操作

    启动和关闭数据库 启动 # mongodb 默认使用执行 mongod 命令所处的盘的根目录下  /data/db 作为自己的数据存储目录 #   所以在第一次执行该命令之前先自己动手新建一个  /d ...

  5. laraver mongo 查询操作

    1,mongo 不支持特殊where条件(&,|) 2,mongo 可以连接mysql的表查询,但不支持连表的where查询

  6. Mongo常用操作

    设置登陆验证 进入Mongo添加用户    db.addUser('root','123456') 编辑Mongo配置文件  vi /etc/mongod.conf   找到#auth = true ...

  7. Mongo 常用操作

    1.查询 [基本形式]db.col.find().pretty():pretty() 方法以格式化的方式来显示所有文档. [获取记录条数]:db.users.find().count(); [读取指定 ...

  8. Mongo数据库操作/数据库版本号

    第一步,找到mongodb安装目录第二步,从命令行进入mongodb安装目录下的bin目录 附:http://www.runoob.com/mongodb/mongodb-create-databas ...

  9. mongo复杂操作

    相比关系型数据库, Array [1,2,3,4,5] 和 Object { 'name':'DragonFire' } 是MongoDB 比较特殊的类型了 特殊在哪里呢?在他们的操作上又有什么需要注 ...

随机推荐

  1. 小程序-wx:for

    wx:for (列表渲染) index默认数组下标item默认数组当前项的变量名 数组是对象的形式,单纯写{{item}},结果是[object object]的形式,必须加对象名,并且对象名基本设置 ...

  2. 自定义typecho后台路径

    如何自定义后台路径 Typecho 安装好后,默认的后台路径是 domain.com/admin/,为了提高安全性,我们允许以 domain.com/xxxx/ 的方式访问,其中 xxxx 是你自定义 ...

  3. (转)使用Vue-Router 2实现路由功能

    注意:vue-router 2只适用于Vue2.x版本,下面我们是基于vue2.0讲的如何使用vue-router 2实现路由功能.推荐使用npm安装. npm install vue-router ...

  4. Android图片剪裁库

    最近利用一周左右的业余时间,终于完成了一个Android图片剪裁库,核心功能是根据自己的理解实现的,部分代码参考了Android源码的图片剪裁应用.现在将该代码开源在Github上以供大家学习和使用, ...

  5. UVa 1583 Digit Generator WA

    #include<stdio.h> int main() { long int n,i,s=0; while(scanf("%d",&n)!=EOF) { in ...

  6. VFS文件系统结构分析 与socket

    本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,并注明原作者及原链接.内容可任意使用,但对因使用该内容引起的后果不做任何保证. 作者:fireaxe_hq@ho ...

  7. JS 作业

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. C++基础 (3) 第三天 构造函数 构造函数初始化列表 拷贝构造函数 析构函数 静态成员变量

    // 同类之间无私处 2构造函数 3析构函数 4构造函数的种类和析构函数的顺序 结论:析构函数的调用顺序,跟对象的构造顺序相反,谁先构造,谁最后一个被析构. 拷贝构造函数: 注意: 等号写在下面和写在 ...

  9. input标签处理多文件上传

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  10. luogu 4240 毒瘤之神的考验 (莫比乌斯反演)

    题目大意:略 题面传送门 果然是一道神duliu题= = 出题人的题解传送门 出题人的题解还是讲得很明白的 1.关于$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m ...