2010-01-02 28 views
3

Je n'arrive pas à obtenir les bons résultats dans mon système de coordonnées. Pour expliquer mon système, j'ai cette base de données simple qui a des colonnes x_axis, y_axis et name. Je n'ai pas besoin de toutes les données, j'ai juste besoin d'en afficher une partie. Par exemple, j'ai un système de coordonnées qui a 10:10 (signifiant de x_axis -10 à 10 et de y_axis -10 à 10) et je veux afficher seulement 49 coordonnées. Dans requête SQL je peux le faire quelque chose comme ceci: "select * from coordonnées où X_AXIS> = -3 et X_AXIS < = 3 et Y_AXIS> = -3 Y_AXIS < = 3"Problèmes avec deux plages de touches dans couchdb

J'ai essayé cette fonction, mais sans succès :

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

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

Je suis un mauvais résultats:

-3X-3 -3x- 2 -3x-1 -3x0 -3x1 -3x2 -3x3 < - ne devrait pas afficher cette partie -> -3x4 -3x5 -3x6 -3x7 -3x8 -3x9 -3x10 < - fin ne doit pas afficher cette partie -> ..... jusqu'à 3x3

pour vous donner une meilleure compréhension de mon projet est ici la capture d'écran de ce que je veux être:

Répondre

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

Vous utilisez ceci comme une clause WHERE. Couchdb ne comprend pas les valeurs de "startkey" et "endkey", il les utilise simplement pour savoir quand commencer et arrêter la sortie des résultats.

Par exemple, prendre le jeu de résultats suivant:

doc1 
doc2 
doc3 
doc4 

Si j'applique cette requête:

startkey = Doc2 & endkey = doc3

Le jeu de résultats serait:

doc2 
doc3 

Pour appliquer une plage dans votre exemple, je modifi fonction ap:

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

Mise à jour pour gérer les gammes dynamiques:

Selon Database Queries the CouchDB Way:

« La conception CouchDB vous obtient d'excellentes performances sur les grands ensembles de données. Mais cela signifie que vous ne pouvez pas passer des paramètres dynamiques à votre fonction de carte lorsque vous exécutez une requête."

Donc, pour faire une gamme dynamique, vous devez modifier la sortie de la valeur de clé à une valeur unique de sorte que vous pouvez utiliser les paramètres startkey et endkey

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

ce filtre.

by_range?startkey=-9&endkey=9 

Dans votre application, vous pouvez calculer les clés de début et de fin en faisant quelque chose comme

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

Salut anduk, Tout d'abord, permettez-moi de vous remercier pour votre réponse rapide. Je vois votre point mais le problème est que la condition que vous faites n'est pas dynamique ce qui signifie qu'elle s'applique seulement à x/y -3 à 3. Ces nombres (-3 et 3) dépendront de la partie sélectionnée des coordonnées. Existe-t-il un moyen de transmettre un paramètre de requête dans ces vues? alors ça va devenir dynamique. quelque chose comme la fonction (doc, req)? Merci encore! – Duasto

+0

J'ai mis à jour mon message - j'espère que cela devrait le résoudre. – andyuk

0

Vous pouvez faire quelque chose comme une clause WHERE avec plusieurs clés et la technique décrite dans ce article.