mongodb為2.6版本,
.net是4.0,
c#接口時1.7。
運行環境為windows8 with visual studio2010
注意事項:在mongodb中使用地理位置存儲信息且動用到范圍查詢的請先將其地理信息以數組的形式建立數據集(c#代碼:double[] location{double latitude=*.*f,double longitude=*.*f})否則無法建立2d地理位置索引,然后在monggodb的collection(關系型數據庫中的’表‘)中將此地理位置建立2d索引。網上有人表示建立此索引必須用戶親自操作數據庫,不能使用.net中的collection.createIndex()或其他建立索引的接口。另外,很多人在c#中收集信息的類成員使用get{}set{}方法,在這里請務必小心大小寫,代碼的第40行中已注明。在做數據查詢時寫BsonDocument或query時一定要注意大小寫因為mongodb區分大小寫
操作實例:
1)連接數據庫(nearby)
2)打開對應的collection
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的可持久化操作實現,就把能注意的東西填上避免其他人多走彎路了。
引用或轉載此文檔請務必添加原文鏈接或地址。謝謝