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]