2015-12-21 18 views
0

我有一個可選的柱輔助索引:如何使用幻像查詢具有二級索引的可選列?

class Sessions extends CassandraTable[ConcreteSessions, Session] { 
    object matchId extends LongColumn(this) with PartitionKey[Long] 
    object userId extends OptionalLongColumn(this) with Index[Option[Long]] 
    ... 
} 

然而,indexedToQueryColumn隱式轉換不適用於可選列,所以這不會編譯:

def getByUserId(userId: Long): Future[Seq[Session]] = { 
    select.where(_.userId eqs userId).fetch() 
} 

也不對這樣的:

select.where(_.userId eqs Some(userId)).fetch() 

或更改索引類型:

object userId extends OptionalLongColumn(this) with Index[Long] 

有沒有辦法使用幻像執行這樣的查詢?

我知道我可以反規範化,但它會涉及一些非常混亂的家務和三倍我們的(大量的)數據大小。查詢通常只返回一些結果,所以我願意在這種情況下使用二級索引。

回答

1

簡短的回答:你不能使用可選字段來查詢幻像中的東西。

龍詳細的解答:

但是,如果你真的想與二次可選列工作,你應該聲明的實體字段作爲選項,但你的幻影表示不應該是爲了來查詢選項。

object userId extends LongColumn(this) with Index[Long] 

在fromRow(R:行),你可以創建你的對象是這樣的:

Sessions(matchId(r), Some(userId(r))) 

然後在服務部分,你可以做到以下幾點:

.value(_.userId, t.userId.getOrElse(0)) 

也有更好的方法來做到這一點。您可以複製表格,創建一個新類型的查詢,如sessions_by_user_id,其中您的user_id將是主鍵,match_id是集羣鍵。

由於user_id是可選的,因此您可以以只包含有效用戶標識的表結束,該表很容易且快速地進行查找。

卡桑德拉依賴於查詢,所以使用它對你有利。

查看我的github項目,可以幫助您在同一個表中查詢多個查詢。

https://github.com/thiagoandrade6/cassandra-phantom

+0

謝謝!我最終擴展了幽靈以支持這一點。我從那時開始進行負載測試,事實證明,我將不得不反正規化,否則性能不夠好。 – Henning

相關問題