自己练手写了一个MongoDb的泛型类,顺便把一些常用命令整理了一下,做个记录:
1 ///2 /// Mongo操作类。 3 /// 4 ///5 /// 参考:http://www.runoob.com/mongodb/mongodb-tutorial.html 6 /// https://docs.mongodb.com/manual/crud/ 7 /// 命令: 8 /// show dbs,查看db列表; 9 /// show collections,查看集合; 10 /// use test,转换到test类; 11 /// 可以使用db.help()或db.[coll].help()查看相关命令,不做缀诉,下面额外提一些运维排错相关的命令。 12 /// 运维: 13 /// db.getPrevError(),查询之前的错误信息,可以通过db.resetError()来重置错误信息。 14 /// 15 /// 16 public class MongoDaowhere T : class 17 { 18 private IMongoCollection _tCol; 19 20 /// 21 /// 构造函数。 22 /// 23 /// 链接字符串,格式如mongodb://[username:password@]host1[:port1],(示例:mongodb://user:123456@127.0.0.1:27017)。 24 /// 对应的数据库名称。 25 /// 对应的集合名称。 26 public MongoDao(string connStr, string dbName, string colName) 27 { 28 var mClient = new MongoClient(connStr); 29 30 _tCol = mClient.GetDatabase(dbName).GetCollection(colName); 31 } 32 33 /// 34 /// 集合操作。 35 /// 36 ///37 /// 命令(列子均已Artcile集合为例,类型:{"_id":1,"User":"新用户","IP":"0.0.0.0","Title":"新标题","Content":"新内容"}): 38 /// db.createCollection(“Artcile”, {size: 20, capped: true, max: 10}),虽然Mongo会自动创建集合,但有时候会有特殊需要,例子中就是创建了一个 39 /// 大小固定的集合,这种集合的插入和按照顺序的查询速度极快,在数据插入达到阈值时会淘汰最早的数据,通常可以应用在特定场景如日志存储。 40 /// db.getCollection("Artcile"),获取指定集合,当然也可以通过db.Artcile这种形式操作。 41 /// db.getCollectionNames(),获取集合列表和show colletions的功能相似。 42 /// db.printCollectionStats(),查看数据集的状态,也可以使用db.Artcile.stats()来查看单个集合的状态。 43 /// db.ensureIndex({Title:1}),创建索引。 44 /// db.Article.getIndexes(),查询当前集合的所有索引,db.Article.reIndex()有类似功能。 45 /// db.Article.dropIndex("Title_1"),按照名称删除指定索引,页可以通过db.Article.dropIdnexes()来删除所有索引。 46 /// 47 public IMongoCollectionMongoCollection 48 { 49 get { return _tCol; } 50 } 51 52 /// 53 /// 添加。 54 /// 55 ///56 /// 命令: 57 /// db.Article.save({"_id":1,"User":"新用户","IP":"0.0.0.0","Title":"新标题","Content":"新内容"}),添加数据,集合对于列没有固定要求,不过建议固定格式。 58 /// 59 public void Add(T tObj) 60 { 61 var id = ObjectId.GenerateNewId(); 62 _tCol.InsertOne(tObj); 63 } 64 65 66 ///67 /// 批量添加。 68 /// 69 ///70 /// 71 /// 72 public void AddMany(ListtObjs) 73 { 74 _tCol.InsertMany(tObjs); 75 } 76 77 /// 78 /// 查找一个。 79 /// 80 ///81 /// 82 /// 83 public T FindOne(Expression> filter) 84 { 85 return _tCol.Find(filter).First(); 86 } 87 88 /// 89 /// 查找多个。 90 /// 91 ///92 /// 命令: 93 /// db.Article.find(),查找所有记录。 94 /// db.Article.distinct("Tilte"),相当于关系型数据库中的distinct。 95 /// db.Article.find({_id:1}),查找id为1的文章。 96 /// db.Article.find({_id:{$lt:2}}),查找id小于2的文章,以此类推,lt表示小于,gt表示大于,gte表示大于等于,lte表示小于等于。 97 /// db.Article.find({_id:{$lt:10,$gt:5}}),查找id小于10大于5的文章,这里的逗号表示一种and关系。 98 /// db.Article.find({$or:[{_id:{$lt:10}},{_id:{$gt:1990}}]}),or的关系需要用数组来表达,这个例子就表示查找id小于10或者大于1990的数据。 99 /// db.Article.find().sort({_id:1}).sort({_id:-1}).skip(10).limit(2),其中的sort表示排序,1表示升序,-1表示降序,skip表示跳过多少条,limit表示取多少条。100 /// db.Article.findOne(),表示返回第一条数据。101 /// db.Article.count(),返回集合的个数。102 /// 103 public ListFindAll(Expression > filter)104 {105 return _tCol.Find(filter).ToList();106 }107 108 /// 109 /// 按条件删除。110 /// 111 ///112 /// 命令:113 /// db.Article.remove({_id:1})114 /// 115 public long Delete(Expression> filter)116 {117 return _tCol.DeleteMany(filter).DeletedCount;118 }119 120 /// 121 /// 按条件更新一个。122 /// 123 ///124 /// 命令:125 /// db.Article.update({_id:1},{$set:{Title:"测试"}},false,true),更新数据,第三个参数表示是不存在否插入,为false表示数据不存在时不插入;第四个参数表示是否更新多个,为flase表示只更新一个。126 /// db.Article.findAndModify({query:{_id:{$gte:50}},sort:{_id:-1},update:{$set:{Title:"新测试"}}}),查询修改127 /// 128 public long Update(Expression> filter, T newObj)129 { 130 return _tCol.ReplaceOne(filter, newObj).MatchedCount;131 }132 133 /// 134 /// 按条件更新多个。135 /// 136 ///137 /// 138 /// 139 public void Update(Expression> filter, Dictionary >, object> upd)140 {141 var fd = Builders .Filter.Where(filter);142 143 UpdateDefinition ud = null;144 foreach (var up in upd)145 {146 if (ud == null)147 ud = Builders .Update.Set(up.Key, up.Value);148 else149 ud = ud.Set(up.Key, up.Value);150 }151 _tCol.UpdateMany(fd, ud);152 }153 154 /// 155 /// Map:把一个操作Map到集合中的每一个文档156 /// Shuffle:根据Key分组157 /// Reduce:处理值表中的元素,直到值表中只有一个元素158 /// Finalize:不是必须的,对数据进行格式化操作159 /// 160 public void MapReduce()161 {162 var _mCode = @"function(){if(this._id<100){emit(this._id,{Title:this.Title})}}";163 var _rCode = @"function(key,values){return JSON.stringify(values)}";164 165 166 BsonJavaScript _mjs = new BsonJavaScript(_mCode);167 BsonJavaScript _rjs = new BsonJavaScript(_rCode);168 var mr = _tCol.MapReduce(_mjs, _rjs).ToList();169 170 }171 }172 173 public class MapType174 {175 public long _id { get; set; }176 177 public MResult value { get; set; }178 }179 180 public class MResult181 {182 public string Title { get; set; }183 }