2012-10-05

[C#][NoSQL] 第一次 使用 C# 操控 MongoDB 就上手 (查詢資料)

 

上篇文章 第一次 使用 C# 操控 MongoDB 就上手 (新增資料篇) 已經把資料送進去了..

分別為 Name: Donma1~Donma100 還有 Age: 1~ 100的資料 ,我們才模擬幾種比較常見的查詢也可以看看MongoDB方便的地方..

1. 透過Id 進行查詢,回傳結果只有一筆

我們來看下MongoLab上面的資料..

sshot-160_2

其中它的Id 為 5011175615d1b20bd8448622 我們就先以這資料當作Sample 對 Users 這Collection進行搜尋出Donma1這筆資料

C# Code :

//MongoDB 的 Conection URL 
var connectionString = "mongodb://user1:[email protected]:35167/sampledb";
 
//建立連線
var server = MongoServer.Create(connectionString);
 
//取得指定Database
var db = server.GetDatabase("sampledb");
 
//指定操作Collection 為 Users 
MongoCollection<User> coll = db.GetCollection<User>("Users");
 
//建立查詢條件,查詢Id 為 5011175615d1b20bd8448622
var query = Query.EQ("_id", new BsonObjectId("5011175615d1b20bd8448622"));
 
//尋找一筆資料回來
var user = coll.FindOne(query);
 
//顯示
Response.Write("Name:" +user.Name + ","+"Age:"+user.Age+","+"Id:"+user.Id);

輸出結果:


Name:Donma1,Age:1,Id:5011175615d1b20bd8448622


資料正確,接下來我們來看看其他的搜尋..



2.透過關鍵字搜尋,回傳結果為多筆


因為資料Name 有 Donma1~Donma100


我們來搜尋出來 帶有 "onma1" 關鍵字的資料出來..


C# Code:



//MongoDB 的 Conection URL 
var connectionString = "mongodb://user1:[email protected]:35167/sampledb";
 
//建立連線
var server = MongoServer.Create(connectionString);
 
//取得指定Database
var db = server.GetDatabase("sampledb");
 
//指定操作Collection 為 Users 
MongoCollection<User> coll = db.GetCollection<User>("Users");
 
//只要Match 到  onma1 的都會出現
var query = Query.Matches("Name", new BsonRegularExpression("onma1"));
 
//搜尋所有解果回來
var all_user = coll.Find(query);
 
//顯示
 
foreach (var user in all_user)
{
    Response.Write("Name:" + user.Name + " , " + "Age:" + user.Age + " , " + "Id:" + user.Id +"<br />");
}

結果:


Name:Donma1 , Age:1 , Id:5011175615d1b20bd8448622
Name:Donma10 , Age:10 , Id:5011175615d1b20bd844862b
Name:Donma11 , Age:11 , Id:5011175615d1b20bd844862c
Name:Donma12 , Age:12 , Id:5011175615d1b20bd844862d
Name:Donma13 , Age:13 , Id:5011175615d1b20bd844862e
Name:Donma14 , Age:14 , Id:5011175615d1b20bd844862f
Name:Donma15 , Age:15 , Id:5011175615d1b20bd8448630
Name:Donma16 , Age:16 , Id:5011175615d1b20bd8448631
Name:Donma17 , Age:17 , Id:5011175615d1b20bd8448632
Name:Donma18 , Age:18 , Id:5011175615d1b20bd8448633
Name:Donma19 , Age:19 , Id:5011175615d1b20bd8448634
Name:Donma100 , Age:100 , Id:5011175615d1b20bd8448685


結果沒錯 連Donma100 都有了..



3.透過Regular Expression 搜尋文字中的數字範圍


如果我想搜尋 Donma10~Donma20 呢..


這時候就要用到Regular Expression ..


C# Code :



 
//MongoDB 的 Conection URL 
var connectionString = "mongodb://user1:[email protected]:35167/sampledb";
 
//建立連線
var server = MongoServer.Create(connectionString);
 
//取得指定Database
var db = server.GetDatabase("sampledb");
 
//指定操作Collection 為 Users 
MongoCollection<User> coll = db.GetCollection<User>("Users");
 
//透過Regular Expression 1開頭 第二位數0~9且只能一位數,也包含20
var query = Query.Matches("Name", new BsonRegularExpression("Donma1([0-9]{1,1})$|20"));
 
//搜尋所有結果回來
var all_user = coll.Find(query);
 
//顯示
 
foreach (var user in all_user)
{
    Response.Write("Name:" + user.Name + " , " + "Age:" + user.Age + " , " + "Id:" + user.Id + "<br />");
}

結果:


Name:Donma10 , Age:10 , Id:5011175615d1b20bd844862b
Name:Donma11 , Age:11 , Id:5011175615d1b20bd844862c
Name:Donma12 , Age:12 , Id:5011175615d1b20bd844862d
Name:Donma13 , Age:13 , Id:5011175615d1b20bd844862e
Name:Donma14 , Age:14 , Id:5011175615d1b20bd844862f
Name:Donma15 , Age:15 , Id:5011175615d1b20bd8448630
Name:Donma16 , Age:16 , Id:5011175615d1b20bd8448631
Name:Donma17 , Age:17 , Id:5011175615d1b20bd8448632
Name:Donma18 , Age:18 , Id:5011175615d1b20bd8448633
Name:Donma19 , Age:19 , Id:5011175615d1b20bd8448634
Name:Donma20 , Age:20 , Id:5011175615d1b20bd8448635


因為Name 並非 int 這種文字型態,不過他很方便地提供,可以透過Regular Expression 去搜尋…


我Regular Expression 沒有很熟,所以不是寫得很完美,我也測試了好久..QQ..



4.數值,範圍搜尋


其中資料的年齡為1~100 我們就對那欄位進行搜尋,搜尋此範圍10~20 的資料出來..


C# Code :



//MongoDB 的 Conection URI
var connectionString = "mongodb://user1:[email protected]:35167/sampledb";
 
//建立連線
var server = MongoServer.Create(connectionString);
 
//取得指定Database
var db = server.GetDatabase("sampledb");
 
//指定操作Collection 為 Users 
MongoCollection<User> coll = db.GetCollection<User>("Users");
 
//搜尋資料 >=10 且<=20 
var query = Query.And(Query.GTE("Age", 10), Query.LTE("Age", 20));
 
//搜尋所有結果回來
var all_user = coll.Find(query);
 
//顯示
 
foreach (var user in all_user)
{
    Response.Write("Name:" + user.Name + " , " + "Age:" + user.Age + " , " + "Id:" + user.Id + "<br />");
}

結果:


Name:Donma10 , Age:10 , Id:5011175615d1b20bd844862b
Name:Donma11 , Age:11 , Id:5011175615d1b20bd844862c
Name:Donma12 , Age:12 , Id:5011175615d1b20bd844862d
Name:Donma13 , Age:13 , Id:5011175615d1b20bd844862e
Name:Donma14 , Age:14 , Id:5011175615d1b20bd844862f
Name:Donma15 , Age:15 , Id:5011175615d1b20bd8448630
Name:Donma16 , Age:16 , Id:5011175615d1b20bd8448631
Name:Donma17 , Age:17 , Id:5011175615d1b20bd8448632
Name:Donma18 , Age:18 , Id:5011175615d1b20bd8448633
Name:Donma19 , Age:19 , Id:5011175615d1b20bd8448634
Name:Donma20 , Age:20 , Id:5011175615d1b20bd8448635


 


GTE 代表為 最小起始值且包含 如果是 GT 就是不包含


LTE 代表為 最大值且包含 如果是LT就是不包含..


這部分有機會再聊聊…


以上,用簡單的的資料範例,來介紹搜尋情形,當然以後有機會再寫比較複雜的搜尋介紹..