C#操做Mongodb的心得

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中的一點心得,高手們若是有更好的理解或方法還請指教小弟!!

相關文章
相關標籤/搜索