hc6538 发表于 2017-12-15 12:43:24

MongoDB samus驱动(2)

  上一篇中提到驱动的链接方式,这篇给出完整链接代码和使用实例
  数据库完整链接
  

1 static IMongo _mongo = null;  

2 public MongoDrive()//这个类集成了>
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驱动定义好的,实际是>  删除数据:
  

  

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

  基本上构建查询文档就这些了,
  分组查询,联合查询,高级查询下次再说
页: [1]
查看完整版本: MongoDB samus驱动(2)