2015-02-18 17 views
9

ile sipariş vermek için getall kullanımı iki zaman damgası arasında id = 1 nerede kayıtlar listelemek ve son olarak zaman damgasına göre sıralamak istiyorum.RethinkDB

MySQL sorgusu şey:

Select * from test 
where (timestamp between 100099323 AND 1423699323) AND id=1 
order by timestamp 

tekrar düşünmek veritabanında 5 milyondan fazla belge yoktur.

Select * from test where id=1 order by timestamp 

ve Rethinkdb sorgusu:

Basit MySQL sorgusu için dizini kullanarak çalıştı

r.table('test').getAll(1, {index: 'id'}).orderBy({index: 'timestamp'}) 

ama hata alıyorum:

RqlRuntimeError: Indexed order_by can only be performed on a TABLE or 
TABLE_SLICE in: 
r.table("test").getAll(1, {index: "id"}).orderBy({index: "timestamp"}) 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Herhangi öneri?

cevap

11

RethinkDB, verimli dizin kesişimini desteklemez (Github sorunu bunu eklemek için #809), ancak bu sorguyu 'id' ve 'timestamp' dizinleri için bir bileşik dizin ekleyerek verimli bir şekilde uygulayabilirsiniz. Eğer

r.table("test").getAll(1, {index: "id"}).orderBy("timestamp") 

büyük sonuç kümeleri için verimli Bunu yapmak için oluşturma: sonuç kümesi yeterince küçükse

olsa da, orderBy sadece 'index' OPTARG bırakarak bellek içi tamamen yapılabilir bir endekse ihtiyacınız var.

r.table("test").indexCreate("id_time", 
          function(row) { 
           return [row("id"), row("timestamp")]; 
          }) 

id=1 ile tüm satırları almak ve sıralama damgası ile, daha sonra aday olacağını: endeksi ekleme gibi görünecektir, senin 'kimlik' varsayarsak ve 'damgası' endeksleri satırlarınızda doğrudan alanlara karşılık gelir:

r.table("test").between([1], [2], {"index": "id_time"}) 
       .orderBy({"index": "id_time"}) 

Ayrıca, geri gönderilen orijinal sorguya gidiyor, sen çalıştırarak id=1 için iki damgaları arasındaki sorgulamak olabilir:

r.table("test").between([1, <time 1>], [1, <time 2>], {"index": "id_time"}) 
       .orderBy({"index": "id_time"})