2016-01-12 4 views
5

Я использую драйвер Nodejs Cassandra, и я хочу, чтобы получить предыдущую и следующие страницы. Пока documentation показывает извлечение следующей страницы, которая сохраняет pageState с предыдущей страницы и передает ее в качестве параметра. К сожалению, нет информации о том, как перейти на предыдущую страницу.Как перейти на предыдущую страницу с помощью Cassandra вручную paging

Как я понимаю есть два варианта:

  • Сохранить каждый pageState и страница, как пары ключ-значение и использовать pageState для страницы, которую вы хотите перейти.

  • Сохраните полученные данные в массиве и используйте массив для перехода на предыдущую страницу. (Я не думаю, что это хорошее решение, так как я должен хранить большие куски данных в памяти.)

Оба метода не кажется, элегантное решение для меня, но если Я должен выбрать, я буду использовать первый.

Есть ли способ сделать это из коробки, используя Nodejs Cassandra driver?

Другое дело, что в документации используется ручной поисковый вызов, вызывая функцию eachRow. Если я правильно понимаю, он дает вам каждую строку, как только она будет красной от базы данных. Проблема в том, что это реализовано в моем API, и я возвращаю данные для текущей страницы в ответе HTTP. Поэтому для того, чтобы это сделать, мне нужно будет подталкивать каждую строку к настраиваемому массиву, а затем возвращать массив, когда извлекаются данные для текущей страницы. Есть ли способ использовать execute с ручным поиском подкачки, поскольку вышеизложенное кажется излишним?

Благодаря


EDIT:

Это моя модель данных:

CREATE TABLE store_customer_report (
    store_id uuid, 
    segment_id uuid, 
    report_time timestamp, 
    sharder int, 
    customer_email text, 
    count int static, 
    first_name text, 
    last_name text, 
    PRIMARY KEY ((store_id, segment_id, report_time, sharder), customer_email) 
) WITH CLUSTERING ORDER BY (customer_email ASC) 

Я отображения данных в сетке, так что пользователь может перемещаться корыта его , Как я пишу это, я подумал о том, как это сделать, не требуя предыдущих функций, но тем не менее я считаю, что это допустимый случай, и будет здорово, если будет изящное решение.

ответ

3

Существует опция «больше» руководства, это было распространено перед функциями пейджинга. Вы можете сохранить последние ключи раздела/кластеризации текущей страницы, которую вы отправляете обратно в ответ (возможно, зашифрованы в зависимости от того, что это такое, скорее всего, сгенерируйте ключ раздела и только отправляйте/получайте ключи кластеризации, чтобы избежать проблем с безопасностью). Затем, когда вы выполняете ответ «следующей страницы», вам просто нужно запустить свой CQL-запрос. Чтобы вернуться на страницу, измените пункт кластера кластера и перейдите в обратную сторону. Если вы предоставите свою схему, было бы проще привести примеры. То, что вся страницаState действительно так или иначе.

+0

Отличная идея реверсивного порядок запроса. Это отлично работает, если вы выполняете подкачку вручную вручную, но вы можете получить непредсказуемые результаты, если вы используете pagingState, поскольку C * ожидает, что pagingState будет из определенного запроса. На самом деле это может работать, но я не пробовал. –

+0

Благодарим вас за ответ. Я добавил модель данных к моему вопросу. Я до сих пор не совсем понимаю ваше решение, поэтому пример будет высоко оценен. –

3

К сожалению, нет информации о том, как перейти на предыдущую страницу.

Это правильно, когда вы делаете запрос, и есть больше строк, Cassandra возвращает состояние подкачки, чтобы получить следующий набор строк, но не предыдущих.Хотя то, что представляет состояние пейджинга, абстрагируется, оно обычно является указателем на то, где продолжить чтение следующего набора данных, действительно нет концепции чтения предыдущего набора данных (потому что вы только что прочитали его).

Сохраните каждую страницу и запишите в качестве пары ключ-значение и используйте pageState для страницы, на которую вы хотите перейти.

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

Есть ли способ сделать это из коробки с помощью драйвера Nodejs Cassandra?

Не знаю, что, к сожалению, я знаю, что если вы захотите вернуться к предыдущим страницам, вам нужно будет отслеживать состояние.

Есть ли способ использовать выполнение с помощью ручного поискового вызова, поскольку вышеуказанное кажется излишним?

Да, вы можете предоставить pageState в параметре опций с выполнения, а также и это будет расценено, т.е .:

client.execute('SELECT * FROM table', [], {pageState: pageState}, function (err, result) { 
    ... 
    }); 
Смежные вопросы