2012-05-06 32 views
7

好的,所以這裏是關於Casbah和MongoDB基礎知識的另一個問題。從數據庫中取出DBObject後,如何從中提取某些數據?我知道有DBObject.get()方法,返回java.lang.Object。我是否必須這樣做,然後將數據轉換爲所需的類型?我不確定這是做到這一點的最佳方式......任何人都可以推薦如何更好地做到這一點?Casbah Scala MongoDB驅動程序 - 從DBObject獲取數據

UPDATE:

最後我去手動處理所有的東西的方式。由於案例類的限制,我沒有使用薩拉特語,因爲不建議案例類有孩子,而且需要進行架構重新安排。但是,答案被標記爲最佳答案,因爲它在大多數情況下都可以工作,並且在這裏沒有其他更一般的答案。

回答

11

您可以使用MongoDBObject的as方法獲取價值和一個電話丟:

val coll = MongoConnection()(dbName)(collName) 
val query = MongoDBObject("title" -> "some value") 
val obj = coll findOne query 

val someStr = obj.as[String]("title") 
val someInt = obj.as[Int]("count") 
// and so on.. 

注意as將引發異常給定的密​​鑰無法找到。您可以使用getAs,讓你Option[A]

obj.getAs[String]("title") match { 
    case Some(someStr) => ... 
    case None => ... 
} 

提取列表是一個比較複雜一點:

val myListOfInts = 
    (List() ++ obj("nums").asInstanceOf[BasicDBList]) map { _.asInstanceOf[Int] } 

我寫了一個幫手,這使得使用卡斯巴更consice,可能會有幫助,所以我將其附加:

package utils 

import com.mongodb.casbah.Imports._ 

class DBObjectHelper(underlying: DBObject) { 

    def asString(key: String) = underlying.as[String](key) 

    def asDouble(key: String) = underlying.as[Double](key) 

    def asInt(key: String) = underlying.as[Int](key) 

    def asList[A](key: String) = 
    (List() ++ underlying(key).asInstanceOf[BasicDBList]) map { _.asInstanceOf[A] } 

    def asDoubleList(key: String) = asList[Double](key) 
} 

object DBObjectHelper { 

    implicit def toDBObjectHelper(obj: DBObject) = new DBObjectHelper(obj) 

} 

您可以使用助手這樣的:

val someStr = obj asString "title" 
val someInt = obj asInt "count" 
val myDoubleList = obj asDoubleList "coords" 

我希望它能幫助你。

+0

哇,涵蓋了這個話題非常好!謝謝,這顯然現在被選爲最佳答案。 – noncom

+0

當調用val obj = coll.findOne(query)時,我得到'value getAs不是Option [coll.T]的成員'; val str = obj.getAs [String](「myValue」)'。 –

+0

該示例不起作用,'findOne'返回'Option'類型。 – andyczerwonka

2

如果您不害怕使用其他依賴項,請使用Salat。通過Salat,將案例類轉換爲數據庫對象並返回非常簡單。

系列化

val dbo = grater[Company].asDBObject(company) 

反序列化

val company_* = grater[Company].asObject(dbo) 
+0

是的,我知道薩拉......不害怕使用依賴關係,但只有案例級別的需求可能會帶來一些麻煩。如果沒有其他有意義的答案,我將不得不考慮薩拉特,然後......但是案例班可能需要改變架構。 – noncom

+0

它不適用於斯卡拉2.10 – expert

相關問題