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]

ファントムを使用してそのようなクエリを実行する方法はありますか?

非正規化できることはわかっていますが、非常に厄介なハウスキーピングが必要になり、(かなりの) データ サイズが 3 倍になります。通常、クエリはほんの一握りの結果しか返さないため、この場合はセカンダリ インデックスを使用します。

4

1 に答える 1

1

簡単な回答: オプションのフィールドを使用してファントムでクエリを実行することはできませんでした。

長い詳細な回答:

ただし、セカンダリのオプション列を本当に操作したい場合は、エンティティ フィールドをオプションとして宣言する必要がありますが、ファントム表現をクエリのオプションにすることはできません。

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

fromRow(r: Row) では、次のようにオブジェクトを作成できます。

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

次に、サービス部分で次のことができます。

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

また、それを行うためのより良い方法があります。テーブルを複製して、sessions_by_user_id のような新しい種類のクエリを作成することができます。このテーブルでは、user_id が主キーになり、match_id がクラスタリング キーになります。

user_id はオプションであるため、有効なユーザー ID のみを含むテーブルで終了し、簡単かつ迅速に検索できます。

Cassandra はクエリに依存しているため、優先して使用してください。

同じテーブルで複数のクエリを取得するのに役立つ私の github プロジェクトを調べてください。

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

于 2015-12-22T12:16:07.607 に答える