2013-11-02 2 views
7

Позволяет сказать комментарии таблица имеет следующую структуру:RethinkDB индекс для фильтра + OrderBy

id | author | timestamp | body 

Я хочу использовать индекс для эффективного выполнения следующего запроса:

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

Есть другой эффективный метод, который я могу использовать?

Похоже, что текущий индекс не поддерживается для отфильтрованного результата таблицы. При создании индекса для timestamp и добавить его как намек на orderBy('timestamp', {index: timestamp}) я получаю следующее сообщение об ошибке:

RqlRuntimeError: Indexed order_by can only be performed on a TABLE. in:

ответ

11

Это может быть достигнуто с индексом соединения на «автор» и поле «метки времени». Вы можете создать такой индекс, как так:

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) 

межгрупповых работает как get_all сделал в исходном запросе, поскольку он только получает документы, в которых есть автор «я» и любая метка времени. Затем мы делаем order_by по тому же индексу, который заказывается по метке времени (так как все ключи имеют один и тот же автору). Ключ здесь состоит в том, что вы можете использовать только один индекс для доступа к таблице, поэтому нам нужно втиснуть всю эту информацию в тот же индекс.

+0

Это не работает для меня. И похоже, что вы использовали синтаксис Python здесь ...?! – williamle8300

+0

Это работает и очень быстро. Благодаря :) – codefreak

4

Это в настоящее время не представляется возможным Пильная getAll с orderBy использованием индексов дважды. Заказ с индексом можно сделать только на столе прямо сейчас.

NB: Команда OrderBy с индексом не orderBy({index: 'timestamp'}) (нет необходимости повторять ключ)

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 
1

Вы хотите создать так называемый «составной индекс». После этого вы можете запросить его эффективно.

 
//create compound index 
r.table('comments') 
.indexCreate(
    'author__timestamp', [r.row("author"), r.row("timestamp")] 
) 

//the query 
r.table('comments') 
.between(
    ['me', r.minval], 
    ['me', r.maxval], 
    {index: 'author__timestamp'} 
) 
.orderBy({index: r.desc('author__timestamp')}) //or "r.asc" 
.skip(0)  //pagi 
.limit(10) //nation! 

Мне нравится использовать два символа подчеркивания для составных индексов. Это просто стилистика. Неважно, как вы назовете свой составной индекс.

Код: How to use getall with orderby in RethinkDB

Смежные вопросы