1

次の形式のデータを効率的に取得しようとしています。

{
  "datetime": "1453845345493",
  "someIds": ["id2000-4", "id1000-34", "id2000-43", "id250-34"]
}

具体的には、「特定の時間以降に発生したすべてのレコードを検索し、そのうち 1 つ以上の ID のリストを持つレコードを返す」ことです。

これまでのところ、以下を使用して複合マルチインデックスを作成するために、ここに示す方法に従いました。

r.db("dbName").table("tableName")
  .indexCreate(
    "idDatetime", 
    function(each) {
      return each("someIds").map(function(id){
        return [each("datetime"), id]
      })
    }
    ,{multi: true})

これにより、次のような値に基づいてインデックスが正常に構築されます["1453845345493", "id2000-4"]

しかし、今は少し深みがありすぎて、このインデックスを使用して上記の目的を達成するクエリを作成する方法が実際にはわかりません。そのクエリをどのように作成しますか?

4

2 に答える 2

1

私は(間違っているかもしれませんが)、基本的には、2 種類のインデックス ルックアップがあると思います。

  • 完全一致: get,getAll
  • 範囲一致:between

したがって、あなたの場合、getAllあなたがしたいので使用できないことは明らかですfind all records that have happened since a given time, and of those, return any that have one or more of a list of Id

それは私たちだけを残しbetweenます。それでは、それをモデル化する方法を見つけてみましょう。

フィールドを文字列ではなく数値に変更することをお勧めしdatetimeます。エポックを保存していると思います。

あなたがしたように、インデックスを作成します:

r.table('t11').indexCreate('idDatetime', function(doc) {
  return doc('someIds').map(function(id){
        return [doc("datetime"), id]
  })
}, {multi: true})

次に、次のようにクエリします。

r.table('t11')
 .between([1453845345493, "id1000-34"], [r.maxval, "id1000-34"], {index: 'idDatetime'})

そのエポック時間以降のすべてのドキュメントを検索するには、id1000-34. JavaScript または RethinkDB の datetime 関数を使用して、昨日のエポックを見つけることができます。


アップデート:

完全ではありませんが、次のように sth を使用していずれかの id をシミュレートできます。

r.expr(["id1000-34", "id1000-4"])
  .concatMap(function(needle) {
    return r.table('t11')
     .between([1453845345499, needle], [r.maxval, needle], {index: 'idDatetime'})
  })
  .distinct()
于 2016-01-27T23:02:43.923 に答える
0

まだお持ちでない場合は、ドキュメントのマルチインデックスに関するこのページを必ず確認してください。

あなたが示したデータを使用した例は、次のようになります。

r.table("tableName").getAll("id2000-4", {index: "idDatetime"}).run(conn, callback)

これによりid2000-4、その配列にあるそのテーブル内のすべてのドキュメントが取得されます。

これがうまくいくかどうか教えてください!

于 2016-01-27T18:06:51.680 に答える