C# Mongodb動態查詢
關於MONGODB的架設再此小弟就不多做贅述,
已有很多前輩已經分享很多也很棒的教學!
再此只是做個記事,剛好有需求用到,
先記下來避免忘記
目前使用的MongoDB版本是3.0.4
C# driver 則是 2.0.1
範例資料來源-行政院農委會資料開放平台
位置:http://data.coa.gov.tw/Service/OpenData/EzgoAttractions.aspx
JSON資料格式如下
{
"Name": "天送埤休閒農業區",
"Tel": "0937995104 李主委 (遊客中心建置中) 傳真:03-9894089",
"Introduction": "天送埤休閒農業區面積約290公頃,有6個羅東運動公園大,目前有天山、天福二村位在蘭陽平原沖積扇頂端,海拔約130至180公尺,三面環山為平原與山脈的交界處,因為如此的地理特性,造成該地區日夜溫差大,而肥沃的礦物質土壤也讓種植的蔥、蒜、銀柳、梨等作物品質相當好。當地的產業除了頗具知名度的三星蔥蒜外,還有銀柳、芭蕉及號稱「美人腿」的筊白筍。種植面積廣達80公頃的三星銀柳,占台灣總產量95以上,產量可說是獨占鰲頭,優良的品質還外銷到新加坡、香港及加拿大等地,並以行銷品牌概念命名為「天送銀柳」,取天送銀兩的吉祥涵義。行經公路旁的青蔥產區時,可以留意一把把青蔥神采奕奕的挺立著;進到市區看到排成一串人龍的小店面,肯定就是三星有名的小吃「卜肉」,這裡的豬肉可是經過拍打按摩,再裹上特殊配方麵粉油炸而成,肉質香嫩彈牙,吸引不少外地民眾購買。嚐完美食後,不妨到青蔥文化館或天送埤文物館,看看有著長長蔥白的三星蔥到底有何魅力;而天送埤文物館則有過去繁榮伐木業及日常生活的縮影,300多件古玩意有些雖然已從時代洪流中褪色,卻仍保留過去美好時光的種種回憶。【如欲安排前往建議事先電話聯繫確認】",
"TrafficGuidelines": "開車:羅東交流道下高速公路,直走遇中山路一段,右轉接中山路一段(7丙縣道)直走往天送埤方向即扺。大眾運輸搭火車在羅東站下車,轉搭公路局國光號(羅東往天送埤),天送埤終點站下車,步行約3分鐘即達。",
"Address": "宜蘭縣三星鄉下湖路1號",
"OpenHours": "",
"City": "宜蘭縣",
"Town": "三星鄉",
"Coordinate": "24.656365,121.628332"
}
轉換為C# MODEL格式如下
public class CustomObject
{
[BsonId]
public ObjectId Id { get; set; }
public string Name { get; set; }
public string Tel { get; set; }
public string Introduction { get; set; }
public string TrafficGuidelines { get; set; }
public string Address { get; set; }
public string OpenHours { get; set; }
public string City { get; set; }
public string Town { get; set; }
public string Coordinate { get; set; }
}
由於示範資料我已先匯入至Mongodb中,如下圖
所以接下來要做的是就是來比較一下查詢方式嚕
由於C# driver 1.x 版跟20.的版本有些許差異,
目前就以2.0官網的介紹為準
官網參考 :http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/expressions/
我想在SQL中,我們常常會用到where條件,甚至有多個.
那透過C# driver如何達到
以上述官網的為例
var db = BackCollection("testDB");
var collection = db.GetCollection<CustomObject>("TravelRecord");
//以LINQ 查詢方式
// 建立搜尋物件並將CustomObject帶入
FilterDefinitionBuilder<CustomObject> builder = Builders<CustomObject>.Filter;
//建立搜尋條件的定義 就可以透過Lamba的方式將CustomObject物件帶出相對應欲搜尋的欄位
// |代表or,&代表and
// Eq 代表等於
//Regex等同於like
FilterDefinition<CustomObject> filter = builder.Eq(s => s.City, "高雄市")
| builder.Eq(s => s.City, "臺南市")
| builder.Regex(s => s.Address, "新北市");
//取值
var documents = await collection.Find(filter).ToListAsync();
接下來就看一下,有沒有依照我們所下的搜尋條件所帶出要的結果
City =高雄市
City= 新北市
Address Like 新北市
果然是有搜尋到我所需要的值
不過又有一個問題,
假設我們的搜尋條件是動態的是會依照使用者所輸入的欄位所增加的時候怎麼辦?
這時候我就想到在LINQ中有 Dynamic LINQ 這東東,所以看了一下文件
這時候發現其實find這方法提供兩個多載的方法,
第一個Expression就是剛剛第一個透過Linq的方式
第二個呢~@@在點下一層移至定義去瞧瞧
賓果~果然可以帶入字串,不過故名思義,要帶入JSON的格式
現在來試試看嚕
//動態字串-弱型別查詢方式
string wcodecodition2 = " { $or: [ " +
" { City: \"高雄市\"}, " +
" { City: \"臺南市\" }, " +
" { Address: new RegExp(\"新北市\")}"+
" ] "+
" }";
//取值
var documents = await collection.Find(wcodecodition2).ToListAsync();
條件如同剛剛下的一樣,看會不會如實取回相同的結果
結果是一樣的回傳筆數相同!
再此如果有什麼錯誤的地方,還請前輩不吝指導