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"}}

基本上构建查询文档就这些了,

 

分组查询,联合查询,高级查询下次再说

posted @ 2017-05-18 17:57  SalsNET  阅读(328)  评论(0编辑  收藏  举报