MongoDB samus驱动(2)
上一篇中提到驱动的链接方式,这篇给出完整链接代码和使用实例
数据库完整链接
1 static IMongo _mongo = null; 2 public MongoDrive()//这个类集成了 IDisposable 接口 3 { 4 if (_mongo == null) 5 { 6 var connectionString = new MongoConnectionStringBuilder() 7 { 8 ConnectionTimeout = TimeSpan.FromSeconds(30), 9 ConnectionLifetime = TimeSpan.FromSeconds(10), 10 MinimumPoolSize = 1, 11 MaximumPoolSize = 10, 12 Pooled = true, 13 }; 14 connectionString.AddServer(new MongoServerEndPoint("127.0.0.1", 27017)); 15 var config = new mongo.Configuration.MongoConfiguration(); 16 config.ConnectionString = connectionString.ToString(); 17 config.ReadLocalTime = false; 18 _mongo = new Mongo(config); 19 _mongo.Connect(); 20 } 21 } 22 23 public static IMongo Driver 24 { 25 get 26 { 27 return _mongo; 28 } 29 }
添加数据:
1 using (IDocumentDrive db = new MongoDB.MongoDrive()) 2 { 3 db.Driver.Collection("docs").Insert( 4 new Document("uid",123456) 5 .Merge("uName","admin") 6 .Merge("age",new Document("去年八月",DateTime.Now))//Document 值为任何类型, 7 .Merge("addtime", DateTime.UtcNow) 8 ); 9 }
Document 为samus驱动定义好的,实际是 IDictionary<string, object> 的封装.
删除数据:
1 using (IDocumentDrive db = new MongoDB.MongoDrive()) 2 { 3 db.Driver.Collection("docs").Remove(new mongo.Document("uid", 123456));//删除 UID = 123456 的文档 4 }
更新数据:
1 using (IDocumentDrive db = new MongoDB.MongoDrive()) 2 { 3 db.Driver.Collection("docs").Update(new mongo.Document("uName", "drop attr"), new mongo.Document("uid", 123456)); 4 }
更新,除了Update还有一个UpdateAll方法,不做过多解释.
增,删,改 没什么可说,主要说下查询
简单数据查询:
Document doc = db.Collection("docs").FindOne(new mongo.Document("uid",12346));//查询出一个文档,其数据保护文档全部属性及其子文档,查找不到数据为 null,返回值为Document类型
使用时:
var age = doc["age"] //因为Document是Dictionary,所以可以直接使用中索引器取值
doc["uName"] = "mongdb samus";//赋值也是使用索引器
db.Collection("docs").Update(doc , new mongo.Document("uid", 123456));//之后更新这个文档
db.Collection("docs").FindAll().Documents//FindAll 自然就是查询全部文档,FindAll()只返回了游标,调用FindAll().Documents才能正式获取到值,
FindAll().Sort().Skip().Limit()//FindAll 还有几个其他方法,Sort:排序 Skip:跳过条数 Limit:取值条数
Sort("age", MongoDB.IndexOrder.Descending)//排序
Skip(27)//跳过 27 条
Limit(28)//取 28 条
FindAndModify:这个函数类似 UPDATE,
FindAndModify(新文档结构,搜索条件,returnNew=true/false)//根据条件搜索文档,找到则修改文档为新文档格式,并返回文档,返回的是新文档,还是修改前的旧文档,根据returnNew参数决定
还有其他参数如:upsert,是只更新第一个匹配项,还是更新全部匹配项
灵活查询:
db.Collection("docs").Find(new Document("age", 27)).Documents;
Find:函数在项目里用的最多,主要是比较灵活.重载也比较多.
Find(new Document("age", 27), int limit, int skip)//分页查询
Find(new Document("age", 27))//条件查询
和FindAll 函数一样,也是要调用 Documents 才能正常取值,否则只能取到游标.
Find(Document)//这种形式会返回文档全部结构,当查询用户时会返回用户密码,此时需要传递第二个参数
Find(new Document("age", 27),new Document("age", "").Merge("uid","空字符串即可"))//此时返回的文档格式 只包含 age和uid 两个属性
可以看出只要给Find传递Document,然后接受数据就可以了.那么复杂的肯定是如何构建Document,
下面说下怎么构建比较常用的查询条件.
samus驱动有一个Op类.里面定义了条件运算符函数,可以直接使用.
示例:
Op.GreaterThan(27)//生成的是mongoDB 的$gt //大于
Op.GreaterThanOrEqual(27)//生成的是mongoDB 的$gte //大于等于
Op.In(new string[]{"123465","123457","132458"})// IN 操作
根据名字可以直接看出具体是什么意思,不全都写注释了.
Op里没有现成Like函数,我扩展了下:
1 public static Document Like(string key) 2 { 3 return new Document().Merge(new Op().Add("$regex", key)).Merge(new Op().Add("$options", "$i")); 4 }
如何使用Op构建条件查询:
//只做示例,条件肯定是永远无法满足的,勿纠结这个
new Document("uid","123456") //uid=123456 .Merge("age",Op.GreaterThan(27)) // 并且 age > 27
.Merge("addtime",Op.GreaterThan(DateTime.Now)) // 并且 addtime > 当前时间 说明:Op.GreaterThan可以比较不同类型,不一定非是 int
.Merge("age",new Document(Op.GreaterThan(15).Merge(Op.LessThanOrEqual(40)))) //并且 ( age>15 && age <40 )
.Merge("uid",new Document("$nin",new string[]{"123","124","124"})) //并且uid 不在 数组中 .
.Merge("uid",new Document("$in",new string[]{"666","777","888"})) //并且uid 在 666,777,888 中.
.Merge("face.big","http://www.salsnet.win/1.jpg")//搜索子文档:文档格式大概为{'uName':'abc',"face":{"small":"111.jpg","big":"222.jpg"}}
基本上构建查询文档就这些了,
分组查询,联合查询,高级查询下次再说