asp.net的mongodb實例

mongodb爲2.6版本,html

.net是4.0,vue

c#接口時1.7。git

運行環境爲windows8 with visual studio2010mongodb

注意事項:在mongodb中使用地理位置存儲信息且動用到範圍查詢的請先將其地理信息以數組的形式創建數據集(c#代碼:double[] location{double latitude=*.*f,double longitude=*.*f})不然沒法創建2d地理位置索引,而後在monggodb的collection(關係型數據庫中的’表‘)中將此地理位置創建2d索引。網上有人表示創建此索引必須用戶親自操做數據庫,不能使用.net中的collection.createIndex()或其餘創建索引的接口。另外,不少人在c#中收集信息的類成員使用get{}set{}方法,在這裏請務必當心大小寫,代碼的第40行中已註明。在作數據查詢時寫BsonDocument或query時必定要注意大小寫由於mongodb區分大小寫數據庫

操做實例:c#

1)鏈接數據庫(nearby)windows

2)打開對應的collectionapi

3)collection.createIndex()//這個是命令行或終端的方式(僞代碼,詳情請查詢mongodb官方文檔)數組

注:圖形界面的話能夠推薦兩個軟件:網絡

--1)mongo vue (mongovue是Windows操做系統,給你一個優雅的、高度可用的GUI界面與MongoDB MongoDB桌面應用的創新。如今有一個不太擔憂管理您的網絡規模數據。http://www.mongovue.com/ )

--2)umongo(UMongo (前身是 JMongoBrowser) 是一個圖形化界面的工具,用來瀏覽和管理 MongoDB 集羣,支持 Linux, Windows 和 Mac OSX.)

注:命令行或終端能夠根據連接中的文檔進行操做:http://docs.mongodb.org/manual/reference/method/

c#接口的官方文檔:http://api.mongodb.org/csharp/current/html/R_Project_CSharpDriverDocs.htm

注:c#接口下載地址:http://www.nuget.org/packages/mongocsharpdriver/

或者在visual studio2012以上的版本使用nuget命令下載到項目中:Install-Package mongocsharpdriver

-----------------------------------------------------

  1     public class MongoNearby
  2     {
  3         private static object objLock = new object();
  4         private static MongoDatabase mongo ;
  5 
  6         private static MongoDatabase Instance
  7         {
  8             get
  9             {
 10                 if (mongo == null)
 11                 {
 12                     lock (objLock)//防止多線程構造
 13                     {
 14                         string connctionString = "mongodb://192.168.1.x:27017";
 15                         MongoClient client = new MongoClient(connctionString);
 16                         MongoServer server = client.GetServer();
 17                         mongo = server.GetDatabase("nearby");//數據庫
 18                     }
 19                 }
 20                 return mongo;
 21             }
 22         }
 23 
 24         /// <summary>
 25         /// 保存記錄
 26         /// </summary>
 27         /// <param name="info"></param>
 28         /// <returns></returns>
 29         public static bool SaveNearby(NearInfo info)
 30         {
 31             if (info == null)
 32                 return false;
 33             try
 34             {//由於在mongodb中主鍵式objectId,因此在更新數據的話有兩種方式:1)查出惟一鍵對應的主鍵值而後取出該行在更新,2)刪除原有的數據再插入。注意:刪除時要注意刪除的數據是否符合業務需求(由於這種方式不以主鍵來刪除行紀錄)
 35                 MongoCollection collection = Instance.GetCollection<NearInfo>("userinfo");
 36                 QueryDocument query = new QueryDocument();
 37                 query.Add("userid", info.userid);
 38                 collection.Remove(query);
 39 
 40                 WriteConcernResult result = collection.Insert(info);
 41                 CLog.WriteLog("write:  "+info.ToJson());//在插入操做時有必要輸出log以備後用或使用mongodb的日誌存儲
 42                 return result.Ok;
 43             }
 44             catch(Exception ex)
 45             {
 46                 CLog.WriteLog(ex.Message+info.ToJson());
 47                 return false;//在這裏應避免使用return,由於這裏是數據訪問及處理層,業務層調用時可能也使用try{}catch{}結構,因此建議使用throw,由於代碼時測使用,因此當時沒注意到
 48             }
 49         }
 50 
 51         /// <summary>
 52         /// 附近用戶
 53         /// </summary>
 54         /// <param name="sex">性別</param>
 55         /// <param name="longitude">經度</param>
 56         /// <param name="latitude">緯度</param>
 57         /// <param name="total">總數</param>
 58         /// <param name="limit">限制輸出數量</param>
 59         /// <param name="maxDistance">最大半徑</param>
 60         /// <returns></returns>
 61         public static List<UserInfo> GetNearbyUser(int myuid,int sex, double longitude, double latitude, ref int total, int limit = 1000, int maxDistance = 50*1000)
 62         {
 63             List<UserInfo> list = null;
 64             try
 65             {
 66                 list = new List<UserInfo>();
 67                 double radius = 6378000;
 68                 MongoCollection<NearInfo> collection = Instance.GetCollection<NearInfo>("userinfo");
 69 
 70                 #region 方法2 計算出了距離
 71                 IMongoQuery query = Query.NE("userid",myuid);//查詢多行數據時要把本身排除出去
 72                 if (sex ==0 || sex == 1) {
 73                     query =Query.And( Query.NE("sex", 1-sex),Query.NE("userid",myuid));//業務需求
 74                 }
 75                 GeoNearOptionsBuilder options = GeoNearOptions.SetMaxDistance(maxDistance * 1.0 / radius).SetSpherical(true).SetDistanceMultiplier(radius);//設置最大半徑和輸入球體的周長
 76                 var result = collection.GeoNear(query, longitude, latitude, limit, options);//若是是查詢全部用戶,則將query賦值爲query.null
 77 
 78                 var response = result.Response;
 79                 foreach (var item in response["results"].AsBsonArray)
 80                 {
 81                     BsonDocument bson = item.AsBsonDocument;
 82                     var dis = bson["dis"].AsDouble;//間隔的距離
 83                     var obj = bson["obj"].AsBsonDocument;
 84                     NearInfo info = BsonSerializer.Deserialize<NearInfo>(obj);
 85                     if (info == null)
 86                         continue;
 87             /*將反序列的數據賦值到對應的類實例中*/
 88                     UserInfo tmp = new UserInfo { 
 89                         data1 = value1,
 90                         data2 = value2, 
93
...
94 }; 95 list.Add(tmp); 96 total++; 97 //CLog.WriteLog(info.sex.ToString()); 98 } 99 CLog.WriteLog(myuid+"Read: "+result.Response.ToJson()); 100 #endregion 101 //CLog.WriteLog(list.ToJson()); 102 } 103 catch (Exception ex){ 104 CLog.WriteLog(ex.Message);//同更新用戶的方法一致,使用log並throw異常 105 } 106 return list; 107 }
108 }

原本不想寫那麼詳細的,考慮到這篇文章並不是深刻探尋mongodb對於.net的可持久化操做實現,就把能注意的東西填上避免其餘人多走彎路了。

 

 

引用或轉載此文檔請務必添加原文連接或地址。謝謝

相關文章
相關標籤/搜索