Mongodb是一個強大的文檔型數據庫,採用BSON的數據格式。本文主要採用其官方的C#驅動來操做其表中的集合。驅動版本爲1.1.0,下載地址爲:git
http://mongodb.github.io/mongo-csharp-driver/?jmp=docsgithub
純屬我的實踐的一點心得,記錄以下:mongodb
1:鏈接數據庫: 這裏驅動文檔中有詳細的說明,這裏我就再也不囉嗦了,只須要記錄一點:數據庫
若是數據庫爲從庫的狀況下要加入一個設置:server
databaseSettings.SlaveOk = true;blog
string connString = MongoConnectionStrng(configName); server = new MongoClient(connString).GetServer(); databaseName = new MongoUrl(connString).DatabaseName; var databaseSettings =server.CreateDatabaseSettings(databaseName); databaseSettings.SlaveOk = true; database = server.GetDatabase(databaseSettings);
2:查詢集合:這裏主要想說的是用Linq來查詢數據庫中的集合。引入命名空間:MongoDB.Driver.Linq;文檔
若是使用映射的類來查詢的話,這裏須要注意的是「映射類中的字段務必與該集合中的根級字段保持絕對一致」 不然會報映射錯誤。字符串
Mongodb用映射類查詢的這一限制其實很不方便。當一個集合很大且每條記錄的字段都不同時則沒法使用Linq進行查詢了。所string
以鄙人仍是使用了Mongodb固有的格式BsonDocument來進行查詢。值得注意的是:在條件查詢時C# where 條件中的參數務必it
要與Mongodb中的數據類型保持一致。
var ids = search.skus.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); BsonArray idsArray = new BsonArray(); ids.ToList().ForEach(s => { idsArray.Add(long.Parse(s)); }); res = res.Where(s => idsArray.Contains(s["_id"]));
以上的 _id 字段在Mongodb中是 long 類型的,且這裏爲In查詢。
要查詢下一級節點的寫法以下:
res = res.Where(s => s["Availability"]["Status"] == int.Parse(search.productStatus));
這裏Status爲Avaliability的子級節點且爲int類型。
3:在Mongodb的查詢中要注意,每一條記錄的根節點也許是不同的因此當查詢 s["Availability"]["Status"] 而 Availability 節點不存在時,則會報錯。這一點很不方便。
因此介意若是集合很大且每條數據不一致的狀況下,能夠考慮將其BsonDocument文檔所有查出來在C#中進行過濾查詢。我寫了個通用的方法用來查詢各節點的值並返
回字符串。
好比:m.ProductStatus = GetBsonValueByPath(s, "Availability.Status");
/// <summary> /// 此方法爲對bson結果集以 mongodb的查詢方式進行解析如 aaa.bbb.ccc /// 原來不用以此來解析,但生產環境數據有不少不一致因此才用 /// </summary> /// <param name="bsonDoc">BsonDocument</param> /// <param name="path">查詢路徑</param> /// <returns></returns> public string GetBsonValueByPath(BsonDocument bsonDoc, string path) { if (string.IsNullOrEmpty(path)) return string.Empty; string result = null; string[] fieldArray = path.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); BsonDocument tempDoc =bsonDoc; for (int i = 0; i < fieldArray.Length; i++) { string field = fieldArray[i]; BsonElement fieldBsonElem = tempDoc.Elements.Where(s => s.Name == field).FirstOrDefault(); if (null != fieldBsonElem && fieldBsonElem.Value!=BsonNull.Value && i != (fieldArray.Length - 1)) { tempDoc = fieldBsonElem.Value.ToBsonDocument(); } else { if (null == fieldBsonElem) { result = null; } else if (fieldBsonElem.Value == BsonNull.Value) { result = null; } else { result= fieldBsonElem.Value.ToString(); } } } return result; }
以上爲我本人在查詢Mongodb中的一點心得,高手們若是有更好的理解或方法還請指教小弟!!