回到目錄之前已經發生了大叔之前講過被倉儲化了的Mongodb,而在大叔開發了Lind.DDD之後,決定把這個東西再搬到本框架的倉儲層來,這也是大勢所趨的,畢竟mongodb是最像關係資料庫的NoSql,它的使用場景是其它nosql所不能及的,這點是毋庸置疑的!下麵是大叔總結的Mongodb文章目錄,...
之前已經發生了
大叔之前講過被倉儲化了的Mongodb,而在大叔開發了Lind.DDD之後,決定把這個東西再搬到本框架的倉儲層來,這也是大勢所趨的,畢竟mongodb是最像關係資料庫的NoSql,它的使用場景是其它nosql所不能及的,這點是毋庸置疑的!
下麵是大叔總結的Mongodb文章目錄,選自<大叔Mongodb系列>
MongoDB學習筆記~環境搭建 (2015-03-30 10:34)
MongoDB學習筆記~MongoDBRepository倉儲的實現 (2015-04-08 12:00)
MongoDB學習筆記~ObjectId主鍵的設計 (2015-04-09 13:08)
MongoDB學習筆記~客戶端命令行的使用 (2015-04-10 13:40)
MongoDB學習筆記~索引提高查詢效率 (2015-04-10 15:35)
MongoDB學習筆記~為IMongoRepository介面添加分頁取集合的方法 (2015-04-11 22:13)
MongoDB學習筆記~Mongo集群和副本集 (2015-04-17 16:25)
MongoDB學習筆記~為IMongoRepository介面添加了排序和表達式樹,針對官方驅動 (2015-04-27 22:11)
MongoDB學習筆記~為IMongoRepository介面添加了增刪改方法,針對官方驅動 (2015-04-29 22:36)
MongoDB學習筆記~為IMongoRepository介面更新指定欄位(2015-04-30 22:22)
MongoDB學習筆記~關於官方驅動集成IQueryable之後的一些事
MongoDB學習筆記~以匿名對象做為查詢參數,方便查詢子對象
MongoDB學習筆記~Update方法更新集合屬性後的怪問題
MongoDB學習筆記~自己封裝的Curd操作(查詢集合對象屬性,更新集合對象)
MongoDB學習筆記~自己封裝的Curd操作(按需更新的先決條件)
MongoDB學習筆記~大叔框架實體更新支持N層嵌套~遞歸遞歸我愛你!
MongoDB學習筆記~大叔分享批量添加—批量更新—批量刪除
MongoDB學習筆記~MongoVUE對數據進行查詢,排序和按需顯示
MongoDB學習筆記~管道中的分組實現group+distinct
MongoDB學習筆記~數據結構與實體對象不一致時,它會怎麼樣?
Lind.DDD里的倉儲模塊,Mongodb有一席之地
大叔的Mongodb倉儲結構
大叔在設計mongodb查詢和更新時,使用到了遞歸
/// <summary> /// 按需要更新的構建者 /// 遞歸構建Update操作串 /// </summary> /// <param name="fieldList"></param> /// <param name="property"></param> /// <param name="propertyValue"></param> /// <param name="item"></param> /// <param name="fatherValue"></param> /// <param name="father"></param> private void GenerateRecursionExpress( List<UpdateDefinition<TEntity>> fieldList, PropertyInfo property, object propertyValue, TEntity item, object fatherValue, string father) { //複雜類型 if (property.PropertyType.IsClass && property.PropertyType != typeof(string) && propertyValue != null) { //集合 if (typeof(IList).IsAssignableFrom(propertyValue.GetType())) { var modifyIndex = 0;//要更新的記錄索引 foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public)) { if (sub.PropertyType.IsClass && sub.PropertyType != typeof(string)) { var arr = propertyValue as IList; if (arr != null && arr.Count > 0) { var oldValue = property.GetValue(fatherValue ?? item) as IList; if (oldValue != null) { for (int index = 0; index < arr.Count; index++) { for (modifyIndex = 0; modifyIndex < oldValue.Count; modifyIndex++) if (sub.PropertyType.GetProperty(EntityKey).GetValue(oldValue[modifyIndex]).ToString() == sub.PropertyType.GetProperty(EntityKey).GetValue(arr[index]).ToString())//比較_id是否相等 break; foreach (var subInner in sub.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public)) { if (string.IsNullOrWhiteSpace(father)) GenerateRecursionExpress(fieldList, subInner, subInner.GetValue(arr[index]), item, arr[index], property.Name + "." + modifyIndex); else GenerateRecursionExpress(fieldList, subInner, subInner.GetValue(arr[index]), item, arr[index], father + "." + property.Name + "." + modifyIndex); } } } } } } } //實體 else { foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public)) { if (string.IsNullOrWhiteSpace(father)) GenerateRecursionExpress(fieldList, sub, sub.GetValue(propertyValue), item, property.GetValue(fatherValue), property.Name); else GenerateRecursionExpress(fieldList, sub, sub.GetValue(propertyValue), item, property.GetValue(fatherValue), father + "." + property.Name); } } } //簡單類型 else { if (property.Name != EntityKey)//更新集中不能有實體鍵_id { if (string.IsNullOrWhiteSpace(father)) fieldList.Add(Builders<TEntity>.Update.Set(property.Name, propertyValue)); else fieldList.Add(Builders<TEntity>.Update.Set(father + "." + property.Name, propertyValue)); } } }
讓代碼去改變我們的生活,改變我們的世界吧!