MongoDB的三層操作

今天也不知道哪根筋不對(duì)了,沒(méi)有打dota卻想寫(xiě)一篇文章,其實(shí)自己也不知道寫(xiě)什么,專(zhuān)業(yè)技術(shù)較水,但真的很想寫(xiě),自己文采又不夠,所以還是只能寫(xiě)技術(shù)方面的文章啦!半瓶子還是可以晃蕩晃蕩的哈哈~ NOSQL近來(lái)勢(shì)頭不錯(cuò),mongodb更是其中的嬌嬌者,自己學(xué)nosql的

今天也不知道哪根筋不對(duì)了,沒(méi)有打dota卻想寫(xiě)一篇文章,其實(shí)自己也不知道寫(xiě)什么,專(zhuān)業(yè)技術(shù)較水,但真的很想寫(xiě),自己文采又不夠,所以還是只能寫(xiě)技術(shù)方面的文章啦!半瓶子還是可以晃蕩晃蕩的哈哈~

?

NOSQL近來(lái)勢(shì)頭不錯(cuò),MongoDB更是其中的嬌嬌者,自己學(xué)nosql的時(shí)候也是參考了大量的資料,最終決定要從MongoDB入手的,最重要的原因有兩點(diǎn):1自己是簡(jiǎn)單的愛(ài)好者,一切問(wèn)題我都在想是否有簡(jiǎn)單的方法解決,寧可停下來(lái)去思考大量時(shí)間,也不愿用笨方法馬上去做,而MongoDB的操作大都很簡(jiǎn)單,2自己是JS的愛(ài)好者,沒(méi)事就喜歡拿一本js的本從頭到尾看一邊,也不管記住多少,也不管用不用得到,就是喜歡,MongoDB以BSON格式存儲(chǔ),所以操作也起來(lái)也算得心應(yīng)手!現(xiàn)在做一個(gè)項(xiàng)目正是用MongoDB做為數(shù)據(jù)庫(kù)的,一開(kāi)始沒(méi)有DAL,BLL直接訪問(wèn)數(shù)據(jù)庫(kù),然后就到UI了,香港空間,而且BLL是全靜態(tài)的(我喜歡靜態(tài)方法的調(diào)用簡(jiǎn)單,但狠靜態(tài)類(lèi)的不能繼承!),當(dāng)時(shí)考慮的是用MongoDB的驅(qū)動(dòng)去操作太直白了!感覺(jué)沒(méi)必要再寫(xiě)個(gè)DAL!,后來(lái)知道我想法還是很天真的,哈哈!下面就說(shuō)現(xiàn)在的操作方式吧~

?

一、Module層

[Serializable] user { public ObjectId id; public string n; public int age; public Birthday birth; Birthday { public int y; public int m; public int d; } }

咋一看,虛擬主機(jī),有幾個(gè)地方不規(guī)范,1類(lèi)名首字母和公開(kāi)字段沒(méi)有大寫(xiě),2公開(kāi)的字段,而沒(méi)有用屬性,3字段命名沒(méi)表達(dá)它的意思。現(xiàn)在逐個(gè)解釋一下,類(lèi)名和字段沒(méi)大寫(xiě)首字母主要是數(shù)據(jù)庫(kù)里的命名是遵循js的,用js表示時(shí)大家一般會(huì)這樣寫(xiě):

var user={id:ObjectId(“123456″),n:”loogn”,age:23,birth:{y:1989,m:7,d:7}}

然而,可能有人會(huì)說(shuō)可以用MongoDB.Bson.Serialization.Attributes.BsonElement這樣一個(gè)Attribute關(guān)聯(lián)呢!不過(guò)我不會(huì)那樣做,原因就是太麻煩了!這里可能還是有疑問(wèn),留到第3個(gè)問(wèn)題說(shuō)。

公開(kāi)字段而沒(méi)有用屬性也是不合常理的,學(xué)校老師都交過(guò),不管你能不能理解,反正就是要私有化字段,想公開(kāi)請(qǐng)用屬性,哈哈!不過(guò)我想了很久還是不走尋常路了,目前為止用字段沒(méi)有出現(xiàn)過(guò)缺陷問(wèn)題,我不保證以后不會(huì),但我感覺(jué)幾率十分小,就算真的有什么問(wèn)題必需要用屬性,后面加上{get;set;}也不麻煩吧!屬性畢竟還是方法,用屬性有多余的方法調(diào)用開(kāi)銷(xiāo),而且實(shí)體類(lèi)本來(lái)就是不尋常的類(lèi),一般只表示對(duì)象狀態(tài)(用字段),屬性里如果有邏輯(就像老師常說(shuō)的年齡不能小于0且不能大于150等等!),你會(huì)放到這里做嗎?顯然你都是放在BLL里做!字段命名太短了沒(méi)有表達(dá)它的意思,其實(shí)這個(gè)可以和第一個(gè)一起來(lái)說(shuō),MongoDB是無(wú)模式的,同一個(gè)合集可以保多個(gè)不規(guī)則的文檔,如user集合:

{id:1,n:”user1″,desc:”我的描述”} {id:2,n:”user2″}

?所以數(shù)據(jù)庫(kù)必須保存文檔的每一個(gè)元素的name(即id,name,desc,id,name),所以元素name越短越節(jié)省空間,本來(lái)是用name更能表達(dá)的,這里用了n,其實(shí)只要把常用的約定一下,絕大部分人都是可以接受的。

在user里還有個(gè)內(nèi)嵌類(lèi)Birthday,而這個(gè)類(lèi)大寫(xiě)了首字母,我是這樣考慮的,內(nèi)嵌類(lèi)名全部按C#命名規(guī)范,因?yàn)槿萜黝?lèi)有一個(gè)該內(nèi)嵌類(lèi)類(lèi)型的字段,這里是birth,但如果找不到合適的縮寫(xiě)怎么辦呢,直接小寫(xiě)內(nèi)嵌類(lèi)名就可以了,如內(nèi)嵌城市類(lèi)City,字段名為city就不會(huì)重復(fù)了。

?

二、DAL層

?在這一層要寫(xiě)一個(gè)基類(lèi),完成這個(gè)基類(lèi)后,其他的各各DAL類(lèi)都是浮云了~,在寫(xiě)基類(lèi)之前有一個(gè)MongoHelper,MongoHelper很簡(jiǎn)單,直接給出代碼且不寫(xiě)解釋?zhuān)?/p>

MongoServer

public class MongoHelper { static readonly MongoConnectionStringBuilder ConnectionStringBuilder; static MongoHelper() { ] != null) { ConnectionStringBuilder = ].ConnectionString); } ] != null) { ConnectionStringBuilder = ].ConnectionString); } else { ); } } public static MongoServer GetServer(string connectionString) { var server = MongoServer.Create(connectionString); return server; } public static MongoServer GetServer() { var server = MongoServer.Create(ConnectionStringBuilder); return server; } public static MongoDatabase GetDatabase(string databaseName) { return GetServer().GetDatabase(databaseName); } public static MongoDatabase GetDatabase() { return GetDatabase(ConnectionStringBuilder.DatabaseName); } }

?完了后就可以寫(xiě)B(tài)aseDAL了,如果沒(méi)有泛型,DAL的工作還真是索然無(wú)味,但現(xiàn)在用泛型DAL的工作有趣多了,先承上代碼:

數(shù)據(jù)訪問(wèn)層基類(lèi) BaseDAL { CollectionName { set; get; } 設(shè)置集合名 SetCollectionName(); private MongoCollection m_collection; 根據(jù)CollectionName得到MongoCollection對(duì)象 MongoCollection Collection { get { if (m_collection == null) { CollectionName = SetCollectionName(); m_collection = MongoHelper.GetDatabase().GetCollection(CollectionName); } return m_collection; } } 根據(jù)query條件得到一個(gè)文檔對(duì)象 TDocument FindOne(IMongoQuery query, PreprocessHandler preprocess) { var document = Collection.FindOne(query); if (preprocess != null) { preprocess(ref document); } return document; } 把MongoCursor轉(zhuǎn)換成IList類(lèi)型 IList CursorToList(MongoCursor cursor, PreprocessHandler preprocess) { IList list = new List(30); bool isPreprocess = preprocess != null; foreach (TDocument document in cursor) { var doc = document; if (isPreprocess) preprocess(ref doc); list.Add(doc); } return list; } 根據(jù)query查詢(xún)集合 IList Find(IMongoQuery query, MongoCursorSettings cursorSettings, PreprocessHandler preprocess) { var cursor = Collection.Find(query); if (cursorSettings != null) { cursorSettings.Set(cursor); } var list = CursorToList(cursor, preprocess); return list; } }

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享