2012-10-08 36 views
0

我們使用mongodb,並用scala重寫我們的堆棧的一部分。我想知道是否應該堅持使用mophia,或者使用scala mongodb庫(如子集)。Scala與Mongodb的集成

問題是什麼我擺脫子集?例如與mophia我不必手動定義mongodb字段的名稱,就像我在子集中所做的那樣...

子集真的值得使用嗎?

+0

我敢肯定你必須在Morphia中定義模型,才能使用它來映射到對象。沒有時間給出正確的答案,但是這裏有一個快速評論:我沒有使用子集 - 只有薩拉特,有些東西只有casbah。在我看來,單純的scala風格的語法要比試圖強化Morphia成scala更好。 –

+0

是啊,在你必須定義的模型中,但子集要求你定義單個字段的映射,其中嗎啡反省模型類。 – Dzhu

+0

聽起來像salat優於子集,在這種情況下。 –

回答

0

在Scala中,您應該考慮使用Casbah,這是一個官方支持的基於Java驅動程序的MongoDB接口。

Casbah的方法是爲了在MongoDB之上添加流動的,Scala友好的語法並處理常見類型的轉換。如果您嘗試將Scala List或Seq保存到MongoDB,我們會自動將其轉換爲Java驅動程序可以序列化的類型。如果您閱讀Java類型,我們會在它碰到您的代碼之前將其轉換爲可比較的Scala類型。所有這些旨在讓您專注於使用Scala語言編寫最好的Scala代碼。爲了向您提供您期望從Scala獲得的功能性和隱式轉換工具,以及MongoDB的強大功能和靈活性,我們付出了巨大的努力。

Casbah提供了改進的GridFS,Map/Reduce和核心Mongo API接口。它還提供了模擬內部DSL的流體查詢語法,並允許您編寫看起來像您可能在JS Shell中編寫的代碼。還支持輕鬆添加常用數據類型的新序列化/反序列化機制。

+0

用於casbah的DSL很酷,對scala來說它很好用。然而,morphia的目標是從mongo文檔中進行對象映射,其中casbah更像是java驅動程序,只是讓您訪問可以將基元(或嵌套映射)拉出來的映射 - 完全不用於構建對象映射-在。這就是爲什麼很多人在casbah(甚至morphia或jackson-mapper - 面向java的映射器)上使用salat或子集。 –

0

除了ORM映射器/客戶端庫,我建議你試試Rouge。它會爲Mongo提供一個很好的Query DSL。 Rogue 1.X將只支持Lift-MongoDB,但版本2.x(將在不久的將來發布)將適用於更多的MongoDB庫。

樣品查詢將是(純Scala代碼與編譯時類型檢查):

Venue where (_.mayor eqs 1234) and (_.categories contains "Thai") fetch(10) 

哪些查詢的地點集合,其中1234是市長和泰國是其類別中的一種在10個條目。

3

我們使用casbah + salat,它幾乎適用於所有情況。

+0

salat無法使用2.10 – expert

+0

目前沒有用於2.10的穩定版本,您可以試試1.9.2-SNAPSHOT。我們在生產中使用它,它也運行得很好。 –

+0

我試過了:https://github.com/novus/salat/issues/83 – expert

0

我是子集的作者。我會說「子集」實際上不是一種ORM庫。它沒有使用數據庫和集合的方法,而是將其留給Java/Scala驅動程序。但它更側重於MongoDB文檔的轉換。這種轉換核心是相當通用的,不僅適用於字段的讀/寫,而且適用於需要執行的應用,例如,文檔遷移也是如此。查詢/更新構建器子集提供構建在此「核心」之上。

這就是說,如果你需要ORM,確實有更簡單的選擇。我從來沒有意圖讓Subset與真正的ORM庫競爭,我填補了我在項目中遇到的空白。

+0

能否請你提供一個將DBObject映射到案例類的例子?我在文檔中通過了'Extractors',但它只顯示了映射到單個字段。謝謝! – expert

+0

這可能值得一個單獨的問題? –