2016-03-01 72 views

回答

3

那麼,在Cassandra上建模的時候,你應該記住它不能像關係數據庫那樣工作,而幻影也不是一種休眠。

建模時的一件重要事情就是考慮你想要做的查詢,但讓我們來看看。

幻影允許您使用json表建模嵌套類。

考慮以下幾點:

case class JsonTest(prop1: String, prop2: String) 

case class JsonClass(
    id: UUID, 
    name: String, 
    json: JsonTest, 
    jsonList: List[JsonTest], 
    jsonSet: Set[JsonTest] 
) 

你有JsonClass 3列與JsonTest情況下類類型裏面。

當聲明你的字段,你應該做這樣的事情:

object json extends JsonColumn[ConcreteJsonTable, JsonClass, JsonTest](this) { 
    override def fromJson(obj: String): JsonTest = { 
     JsonParser.parse(obj).extract[JsonTest] 
    } 

    override def toJson(obj: JsonTest): String = { 
     compactRender(Extraction.decompose(obj)) 
    } 
    } 

    object jsonList extends JsonListColumn[ConcreteJsonTable, JsonClass, JsonTest](this) { 
    override def fromJson(obj: String): JsonTest = { 
     JsonParser.parse(obj).extract[JsonTest] 
    } 

    override def toJson(obj: JsonTest): String = { 
     compactRender(Extraction.decompose(obj)) 
    } 
    } 

    object jsonSet extends JsonSetColumn[ConcreteJsonTable, JsonClass, JsonTest](this) { 
    override def fromJson(obj: String): JsonTest = { 
     JsonParser.parse(obj).extract[JsonTest] 
    } 

    override def toJson(obj: JsonTest): String = { 
     compactRender(Extraction.decompose(obj)) 
    } 
    } 

基本上什麼幽靈正在做的是保存一個字符串列中的字符串JSON表示。

來源:https://github.com/outworkers/phantom/blob/develop/phantom-dsl/src/test/scala/com/websudos/phantom/tables/JsonTable.scala

+0

感謝您的幫助。這在Cassandra中看起來如何?你能夠查詢嵌套字段? – Ciaran0

+1

@ Ciaran0它看起來像cassandra裏面的解析json,你無法查詢字段,只能檢索它們。 Datastax正在開發一個支持json的新版本,就像Mongo一樣。 –

1

你不能真正做到這一點,因爲它沒有休眠或類似的東西。您需要使用嵌套類的ID,像這樣:

case class Car(age: Int,size: Int, doorId: UUID) 
case class Door(id: UUID, color:String, size:Int) 

然後,只需添加一個功能的情況下類還給門對象調用getById上。

+0

這是我真的不想做的事情。我可能會從我的項目中刪除幻影。我的應用程序使用具有多個嵌套類的JSON,但我需要將原始對象保存到一個表中。感謝您的回答。 – Ciaran0

+0

那麼,這是用分佈式數據庫構建快速和可擴展應用程序的一種難以可靠的方法。你已經看到了太多的ORM,只是試圖忘記;-) – znurgl

相關問題