2009-06-24 8 views
5

Comment les requêtes à plages multiples sont-elles implémentées dans CouchDB? Pour une condition de plage unique, la combinaison startkey et endkey fonctionne correctement, mais la même chose ne fonctionne pas avec une condition de plage multiple.CouchDB prend-il en charge plusieurs requêtes de plage?

Ma Voir fonction est comme ceci:

"function(doc){ 
     if ((doc['couchrest-type'] == 'Item') 
    && doc['loan_name']&& doc['loan_period']&&  
         doc['loan_amount']) 
    { emit([doc['template_id'], 
      doc['loan_name'],doc['loan_period'], 
      doc['loan_amount']],null);}}" 

je dois obtenir l'ensemble docs avec loan_period> 5 et loan_amount> 30000. Mes paramètres StartKey et endkey sont comme ceci:

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000], 
    :endkey=>["7446567e45dc5155353736cb3d6041c0",{},{},{}],:include_docs => true} 

Ici, je n'obtiens pas le résultat désiré. Je pense que mes paramètres startkey et endkey sont faux. Quelqu'un peut-il m'aider?

Répondre

0

Votre déclaration d'émission me semble un peu étrange. Le but de Emit est de produire une clé (par exemple un indice), puis par exemple des valeurs est le document que vous êtes intéressé par

:

emit(doc.index, [doc.name, doc.address, ....]); 

Vous générez un tableau pour l'index et aucune donnée. pour la vue.

En outre, Couchdb ne fournit pas une intersection de vues car il ne correspond pas très bien au paradigme de carte/réduction. Est-ce que vos besoins se résument à essayer de résoudre ce qui suit:

Puis-je produire un index unique dont je peux extraire une plage particulière? (en utilisant startkey & endkey)

4

Une vue CouchDB est une liste ordonnée d'entrées. Les requêtes sur une vue renvoient une tranche contiguë de cette liste. En tant que tel, il n'est pas possible d'appliquer deux conditions d'inégalité.

En supposant que votre loan_period est une variable discrète, ce cas serait probablement mieux résolu en émettant d'abord la loan_period puis en émettant une requête pour chaque période.

Une solution alternative serait d'utiliser couchdb-lucene. En fait

0

CouchDB permet des vues d'avoir des clés complexes qui sont des tableaux de valeurs dans la question:

[template_id, loan_name, loan_period, loan_amount] 

Avez-vous essayé

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000], 
    :endkey=>["7446567e45dc5155353736cb3d6041c0",{}],:include_docs => true} 

ou peut-être

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0","\u0000",5,30000], 
    :endkey=>["7446567e45dc5155353736cb3d6041c0","\u9999",{}],:include_docs => true} 
1

Vous utilisez des tableaux comme clés. Couchdb comparera les tableaux en comparant chaque élément du tableau dans l'ordre croissant jusqu'à ce que deux éléments ne soient pas égaux.

E.g. pour comparer [1,'a',5] et [1,'c',0] il comparera 1 avec 1, puis 'a' avec 'c' et décidera que [1, 'a', 5] est inférieur à [1, 'a', 0]

explique pourquoi la requête de clé de plage échoue:

["7446567e45dc5155353736cb3d6041c0",nil,5,30000] est supérieure ["7446567e45dc5155353736cb3d6041c0",nil,5,90000]

Questions connexes