0

私は次の構造を持っています:

Item {
  id string,
  title string
  tags []string,
  time int,
  parent string
}

私が欲しいもの、list all items with tags [tag1, tag2, ... etc] of parent "parent-1" and order by time

だから私はこれをやった

r.db("db").table("tb").indexCreate("allByTime", function(row){
  return row("tags").map(function(tag){
    return [row("parent"), tag, row("time")]
  })
})

このようなクエリで動作しました

r.db("db").table("tb").between(["parent-1", "tag1", 0], ["parent-1", "tag1", <some-bigger-timestamp>], {index: "allByTime"}).orderBy(...)

しかし、私もこのようなものが欲しい

r.db("db").table("tb").between(["parent-1", ["tag1", "tag2"], 0], ["parent-1", ["tag1", "tag2"], <some-bigger-timestamp>], {index: "allByTime"}).orderBy(...)

助言がありますか ?

注 ->使いたくないr.filter(...)

私はこのようなことを試しました

r.union(<between-query-1>, <between-query-2>, ...)

しかし、クエリ間に多くの大きなテーブルがある場合、オーバーヘッドがどうなるかわかりません。

4

1 に答える 1

1

正直なところ、あなたが望んでいることは本当に可能だとは思いません。考えてみれば、あなたが望むのは内部に複数のインデックスを持つ複合インデックスであり、RethinkDB でそれを表現する方法はないと思います。

このクエリでは:

r.db("db").table("tb")
 .between(
    ["parent-1", ["tag1", "tag2"], 0], 
    ["parent-1", ["tag1", "tag2"], <some-bigger-timestamp>], 
    {index: "allByTime"}
  )
  .orderBy(...)

ここで必要なのは、'parent1'ANDの親を持つすべてのドキュメントと'tag1'AND'tag2'のタイムスタンプを持つすべてのドキュメント BETWEEN 0and<some-bigger-timestamp>です。その場合、複数の値でフィールドをクエリできないため、ユニオンは実際には機能しないようです。

私の提案する解決策:ただ使用してfilterください!

前に持っていたクエリでは:

r.db("db").table("tb")
 .between(
   ["parent-1", "tag1", 0], 
   ["parent-1", "tag1", <some-bigger-timestamp>], 
   {index: "allByTime"}
 )
 .orderBy(...)

おそらく、使用できるデータの一部にデータを絞り込んでいますfilterfilter絶対に使ってはいけないというのがポイントだと思います。ポイントはfilter、(大規模なデータセットを使用して)すでにインデックスをスマートに使用している(持っている)ときに、スマートに使用することです。そのbetweenクエリの結果が数千を超える場合、問題が発生する可能性がありますが、そうでない場合は心配しません。そうである場合は、データ (いくつの異なる親、タグ、タイムスタンプが存在するか) と単一のドキュメントを一意にするものについて、質問を更新できるかもしれません。

于 2015-10-03T19:03:16.523 に答える