2010-01-02 3 views
3

У меня проблема с получением правильных результатов в моей системе координат. Чтобы объяснить мою систему, у меня есть простая база данных с столбцами x_axis, y_axis и name. Мне не нужно получать все данные, мне просто нужно отобразить их часть.проблемы с двумя диапазонами ключей в couchdb

Например, у меня есть система координат, которая имеет 10:10 (значение от x_axis от -10 до 10 и от y_axis от -10 до 10), и я хочу отображать только 49 координат. В SQL запросе я могу сделать это что-то вроде этого: "выберите * от координат, где x_axis> = -3 и не X_Axis < = 3 и y_axis> = -3 y_axis < = 3"

Я попробовал эту функцию, но никакого успеха :

"by_range": { 
     "map": "function(doc) { emit([doc.x_axis, doc.y_axis], doc) }" 
    } 

by_range StartKey = [- 3, -3] & EndKey = [3,3]

Я получил неправильные результаты:

-3x-3 -3x- 2 -3x-1 -3x0 -3x1 -3x2 -3x3 < - не показывать эту часть -> -3x4 -3x5 -3x6 -3x7 -3x8 -3x9 -3x10 < - конец не должен показывать эту часть -> ..... до 3x3

, чтобы дать вам лучшее понимание моего проекта здесь скриншот того, что я хочу сделать:

ответ

2
by_range?startkey=[-3,-3]&endkey=[3,3] 

Вы используете это как предложение WHERE. Couchdb не понимает значения в «startkey» и «endkey», он просто использует их, чтобы знать, когда начинать и останавливать вывод результатов.

Для примера возьмем следующий результирующий набор:

doc1 
doc2 
doc3 
doc4 

Если я применяю этот запрос:

StartKey = doc2 & EndKey = doc3

Набор результатов будет:

doc2 
doc3 

Чтобы применить диапазон в вашем примере, я бы изменил m функция ап:

function(doc) { 
if (doc.x <= 3 && doc.x >= -3 && doc.y <= 3 && doc.y >= -3) 
    emit([doc.x, doc.y], doc) 
} 

Обновление для обработки динамических диапазонов:

По Database Queries the CouchDB Way:

«Дизайн CouchDB получает вам большую производительность на больших наборах данных. Но это означает, что вы не можете передавать динамические параметры в свою функцию карты при запуске запроса."

Так делать динамический диапазон, вам нужно изменить выход ключевого значения для одного значения, так что вы можете использовать Клавишапуск и EndKey параметров

function(doc) { 
emit(doc.x * doc.y, doc) 
} 

Используйте этот фильтр:.

by_range?startkey=-9&endkey=9 

В приложении вы можете рассчитать начальные и конечные ключи, делая что-то вроде

startkey = (x1*y1) 
endkey = (x2*y2) 
+0

Hi anduk, Прежде всего, позвольте мне поблагодарить вас за ваш быстрый ответ. Я вижу вашу точку зрения, но проблема в том, что условие, которое вы делаете, не является динамическим, поскольку оно применимо только к x/y -3 к 3. Эти числа (-3 и 3) будут изменяться в зависимости от выбранной части координат. Есть ли способ передать параметр запроса в этих представлениях? поэтому он станет динамичным. что-то вроде функции (doc, req)? Еще раз спасибо! – Duasto

+0

Я обновил свое сообщение - надеюсь, это должно решить его. – andyuk

0

Вы можете сделать что-то вроде ИНЕК с несколькими ключами и методики, описанной в этой article.