Как именно startkey и endkey работают в CouchDB?
Я работаю с базой данных локаций в CouchDB. Я создал представление, где мой ключ - это массив с округленными значениями широты и долготы. Сейчас я выбираю со следующими условиями:
Startkey: [ 52.34, 4.883 ]
Endkey: [ 52.37, 4.903 ]
Здесь я ожидаю, что я получу только документы, где широта между 52,34 и 52,37. И долгота между 4.883 и 4.903.
Результат я получаю:
[ 52.358, 4.919 ]
[ 52.358, 4.919 ]
[ 52.362, 4.861 ]
[ 52.362, 4.861 ]
[ 52.362, 4.861 ]
Как вы, возможно, заметили, в первом результате долгота больше, чем долгота конечного ключа, 4.919.
Теперь я знаю / читаю где-то, что я получил бы некоторые значения, которые находятся за пределами диапазона второго элемента в массиве. Но как это возможно, что первый пункт уже не соответствует критериям?
Я немного погуглил и не могу найти объяснение startkey/endkey как массива. Кто может дать мне объяснение того, как CouchDB просматривает документы и определяет, когда "начинать", а когда "заканчивать"?
1 ответ
Предполагая следующие данные на ваш взгляд с этими ключами:
startkey == [a, 11]
а также endkey == [c, 11]
:
[a, 10]
[a, 11] <-- startkey
[a, 12] <--
[b, 10] <--
[b, 11] <--
[b, 12] <--
[c, 10] <--
[c, 11] <-- endkey
[c, 12]
(Все, отмеченное стрелкой, будет возвращено).
Данные в представлении сортируются с помощью ключа. С startkey
а также endkey
Вы можете контролировать, где начинать и заканчивать в представлении. Вы не можете указать ограничения для данных. Все, что отсортировано между startkey
а также endkey
будет возвращен. Пожалуйста, прочитайте http://wiki.apache.org/couchdb/View_collation для получения дополнительной информации.
Если вы хотите выполнять геопространственные запросы, вы должны проверить GeoCouch ( https://github.com/couchbase/geocouch/).
Суммировано: ключи в представлениях CouchDB хранятся в одномерных списках. Записи в этих списках сортируются в соответствии с правилами View_collation. Двумерные массивы могут выглядеть особенными, но на самом деле это не так. [a, 10]
сортируется после [a]
и после a
и раньше [b, 5]
и раньше [c]
(например).
Если вы используете startkey
а также endkey
Скажете "все в том числе и после startkey
и до и в том числе endkey
". startkey
а также endkey
Записи не обязательно должны присутствовать в списке.