8

コメントテーブルが次の構造を持っているとしましょう:

id | author | timestamp | body

次のクエリを効率的に実行するためにインデックスを使用したい:

r.table('comments').getAll("me", {index: "author"}).orderBy('timestamp').run(conn, callback)

私が使用できる他の効率的な方法はありますか?

現在、テーブルのフィルター処理された結果に対してインデックスはサポートされていないようです。のインデックスを作成しtimestampてヒントとして追加するとorderBy('timestamp', {index: timestamp})、次のエラーが発生します。

RqlRuntimeError: インデックス付き order_by は、TABLE でのみ実行できます。の:

4

4 に答える 4

14

これは、「作成者」フィールドと「タイムスタンプ」フィールドの複合インデックスで実現できます。このようなインデックスは次のように作成できます。

r.table("comments").index_create("author_timestamp", lambda x: [x["author"], x["timestamp"]])

次に、それを使用して次のようにクエリを実行できます。

r.table("comments")
 .between(["me", r.minval], ["me", r.maxval]
 .order_by(index="author_timestamp)

between は、元のクエリで get_all が行ったように機能します。これは、作成者が「me」でタイムスタンプがあるドキュメントのみを取得するためです。次に、タイムスタンプで注文する同じインデックスで order_by を実行します (すべてのキーの作成者が同じであるため)。ここで重要なのは、テーブル アクセスごとに 1 つのインデックスしか使用できないため、このすべての情報を同じインデックス。

于 2013-11-03T02:45:17.903 に答える
4

現在、インデックスを 2 回使用getAllして aをチェーンすることはできません。orderBy現在、インデックスを使用した注文はテーブルでのみ実行できます。

注: インデックスを使用して orderBy を実行するコマンドはorderBy({index: 'timestamp'})(キーを繰り返す必要はありません)

于 2013-11-03T01:29:09.320 に答える
2

Joe Doliner による回答が選択されましたが、私には間違っているようです。

まず、betweenコマンドでインデクサーが指定されていません。したがってbetween、プライマリ インデックスを使用します。

第二に、between選択を返す

table.between(lowerKey, upperKey[, {index: 'id', leftBound: 'closed', rightBound: 'open'}]) → selection

インデックスをorderBy使用した選択では実行できません。テーブルのみがインデックスを使用できます。

table.orderBy([key1...], {index: index_name}) → selection<stream>
selection.orderBy(key1, [key2...]) → selection<array>
sequence.orderBy(key1, [key2...]) → array
于 2015-08-13T07:00:42.487 に答える
1

「複合インデックス」と呼ばれるものを作成したいと考えています。その後、効率的にクエリを実行できます。

//複合インデックスを作成
r.table('コメント')
.indexCreate(
  'author__timestamp', [r.row("作者"), r.row("タイムスタンプ")]
)

//クエリ
r.table('コメント')
。の間に(
  ['私', r.minval],
  ['私', r.maxval],
  {index: 'author__timestamp'}
)
.orderBy({index: r.desc('author__timestamp')}) //または「r.asc」
.skip(0) //ページ
.limit(10) //国家!

複合インデックスに 2 つのアンダースコアを使用するのが好きです。それはただのスタイルです。複合インデックスにどのように名前を付けるかは問題ではありません。

参考:RethinkDBのorderbyでgetallを使う方法

于 2016-09-13T17:02:17.030 に答える