MongoDB文檔相當完整,擴展規模就像安裝壹樣簡單。它為冗余、切片、索引和map/reduce提供概念支持。MongoDB的開源社區非常大,非常活躍。MongoDB實際上在很多大型產品中使用,比如迪士尼、Craigslist、Foursquare、GitHub和SourceForge。MongoDB是10gen.com建立和維護的開源項目,由DoubleClick前高管創立。同時,10gen也提供了優秀的商業支持,參與建設。
MongoDB和NoSQL:缺陷與優勢
作為壹個可用的NoSQL方案,MongoDB有很多優點。剛開始接觸nosql數據庫,學習了壹系列基於Java的方案,花了很多時間去了解什麽是列族,Hadoop和HBase的關系,什麽是ZooKeeper。當我最終弄清楚這壹切時,我發現Cassandra和HBase對於NoSQL領域來說確實是非常可靠和值得信賴的解決方案。但是相比其他解決方案,MongoDB讓我在開始寫代碼之前,還沒有理解那麽多概念。
和其他軟件類似,MongoDB也有缺陷。在使用MongoDB壹段時間後,我列出了壹些我經歷過的和需要註意的事情。我變成了“Gotchas”:
●不要從關系數據庫的角度思考。顯然,MongoDB使得構建和執行復雜查詢變得非常容易。當妳實際使用的時候,妳會主要關註效率(像我壹樣)。
MongoDB的索引是二叉樹。如果妳對B樹不熟悉,可能需要了解壹下。這些都涉及到構造滿足提供查詢條件要求的索引方法。
仔細設計索引結構。這就涉及到上面提到的B樹。起初,我的索引在文檔中包含了許多字段,以防我會用到它們。不要犯同樣的錯誤。我有壹個小集合(大約10萬條記錄)的索引,已經增長到17GB以上,比集合本身還大。您不應該希望對包含數百個實體的列表字段進行索引。
● MongoDB采用了壹種非常有趣的方式來實現NoSQL: BSON作為存儲,JSON作為顯示,JavaScript用於管理和Map/Reduce。所以也造成了壹些小問題,比如這個(破壞了數和長的相等運算),可能會在MongoDB流行起來之後繼續顯示。
MongoDB,命令行和驅動程序
MongoDB基本上使用JavaScript客戶端命令行程序來管理復雜的任務,比如數據集成和簡單的信息處理,編程完全用JavaScript語言。在本文中,我們將展示命令行的使用示例。現在有大量的MongoDB客戶端產品可用,它們是由MongoDB社區驅動的。通常每種編程語言都有壹個驅動,所有流行的語言都有,壹些不太流行的也有。本文展示了使用MongoDB的Java驅動程序,並將其與ORM庫(MJORM)進行了比較。
介紹mjorm:MongoDB的orm方案。
在解決的許多有趣的問題中,最近在開發者中NoSQL數據存儲的主要問題趨勢是對象關系映射。對象關系映射是將存儲在傳統關系數據庫中的持久數據映射到應用程序中使用的對象。這使得編程語言使用起來更加流暢和自然。
MongoDB面向文檔的架構使其非常適合對象關系映射,因為文檔本身是作為對象存儲的。遺憾的是,MongoDB中的Java對象關系映射庫並不多,但還是有的,比如morphia-(MongoDB的類型安全Java庫)和Spring-Data(Spring-Data的MongoDB實現(SpringData))。
這些ORM庫使用了大量的註釋,由於某些原因並不適合我,其中最重要的是這些註釋對象在多個項目中的兼容性。這讓我開始了mongo-Java-orm或“MJORM”(讀作me-yorm)項目,這是壹個MongoDB Java對象關系映射項目。MJORM由麻省理工學院授權,並在谷歌代碼項目中發布。項目由maven搭建,maven組件庫由google代碼版本控制服務器托管。MJORM的最新可用發布版本是0.15,已經在壹些項目和生產環境中使用。
開始使用ORM
加入MJORM庫
Maven用戶應該首先將MJORM的Maven存儲庫添加到pom.xml中,以使MJORM組件可用。
然後添加依賴項:
這樣,MJORM代碼就可以引入到應用程序中。如果不使用maven,需要手動下載MJORM的pom.xml中列出的所有依賴項,POJOs依賴項已經導入,可以開始編碼了。讓我們從POJO開始:
我們在這個對象模型中的描述是作者有ID,姓和名,書有ID,ISNB,書名,描述和作者。妳可能註意到了,書的id屬性是壹個字符串,是為了適應MongoDB的對象ID類型。MongoDB的ID是12字節的二進制值,顯示為十六進制字符串。MongoDB要求集合中的每個文檔必須有壹個惟壹的id,但不要求它是ObjectId。目前MJORM只支持ObjectId,顯示為字符串。您可能還註意到Author沒有id字段。這是因為書是它的父文檔,所以不需要有id。記住,MongoDB只需要根級別集合中文檔的id。創建XML映射文件的下壹步是創建XML映射文件。MJORM可以將MongoDB文檔轉換成對象。作為示範,我們為每個文檔創建壹個對象,無論是將所有映射放在壹個XML文件中還是將它們分開。
Author.mjorm.xml:
Book.mjorm.xml:
這些映射文件可以很好地解釋它們自己。descriptors元素是根元素,必須包含在每個映射文件中。在它下面是定義文檔的相應類的object元素。對象包含屬性元素,這些元素主要用於描述POJO中的屬性以及這些屬性如何與MongoDB中的文檔相對應。property元素必須包含至少壹個name屬性,這是POJO和MongoDB文檔中的屬性名。column屬性是可選的,用於在MongoDB文檔中指定可選的屬性名。property元素中的id屬性應該是對象的唯壹標識。壹個對象中只有壹個property元素可以包含id屬性。auto的設置將使MJORM在持久化時自動為該屬性生成壹個值。妳可以在google code的MJORM項目主頁看到更詳細的XML映射文件的描述。整合POJO和XML,我們創建了壹個數據模型和映射文件,讓MJORM可以從MongoDB序列號和反序列號下載POJO。我們可以做壹些有趣的事情,首先打開MongoDB的鏈接:
Mongo對象由10gen編寫的Java驅動程序提供,示例中連接了本地MongoDB實例中的mjormIsFun數據庫。接下來,我們創建MJORM ObjectMapper。目前MJORM中ObjectMapper的唯壹實現是XmlDescriptorObjectMapper,它使用XML結構來描述信息。稍後可能會添加對註釋或其他結構定義的支持。
建立了XmlDescriptorObjectMapper並添加了映射文件。接下來,建立壹個由MJORM提供的MongoDao對象的實例。
首先,我們需要獲得10gen驅動程序提供的DB對象實例。然後使用DB和ObjectMapper構建MongoDao。我們將開始持久化數據,構建壹本書並保存在MongoDB中。
首先創建壹個Book對象並填入值,然後調用MongoDao的createObject方法將Book對象傳入“books”集合。MJORM會根據之前的xml映射文件將圖書轉換成DBObject(這是10gen的Java驅動使用的基本類型),並將壹個新文檔保存到“books”集合中。當MJORM返回Book對象時,id屬性被填充。請註意,默認情況下,MongoDB在使用前不需要創建數據庫或集合,系統會在需要時自動創建,這可能會造成壹些麻煩。在MongoDB的命令行中查看Book對象大概如下:
我們來看看如果直接用10gen的Java驅動代替MJORM,如何使用createObject方法:
對象的查詢如下:
readObject方法根據給定文檔的id從指定集合中讀取文檔,將其轉換為對象(再次使用映射文件)並返回。敏銳的讀者會註意到,這本書沒有指明作者,但它仍然被保存了下來。這是由於MongoDB結構的不敏感性。我們不能要求集合中的文檔包含所有的屬性(id屬性是必須的),MongoDB中所有沒有作者的書都可以。我們現在向圖書中添加壹個作者並更新它:
現在這本書包含了作者,並被持久化在MongoDB中。現在看看這本書的命令行:
可以看到持久書已經包含了作者。不要使用MJORM再次操作它:
對MongoDao方法的深入討論超出了本文的範圍。對於有興趣在實際項目中使用MJORM的用戶,強烈建議了解MJORM項目提供的相關文檔或者MongoDao接口提供的相關用法。