2017-06-14 3 views
0

J'utilise ektrop pour interroger une vue comme si:vue CouchDB: toutes les clés correspondant à seulement

query = new ViewQuery().designDocId("_design/accounts").viewName("by_account").key(search).startKey(0).endKey(99); 

Cela renverra les documents qui correspondent à la search clé ou ceux entre le début et la clé de fin. J'essaie d'obtenir des documents dans la vue qui correspondent à la fois le search et les clés de début/fin. Comment puis-je l'obtenir?

Mon point de vue est formé comme ceci:

"by_account": { 
      "map": "function(doc) { 
        emit(doc.loginString,doc); 
        emit(doc.enrolmentPercentage, doc); }" 
     } 

Répondre

2
  1. Évitez l'émission du document que la valeur map/reduce. Cela fera partie de l'index, donc l'indice sera plus grand et plus lent. N'émettez aucune valeur à la place et utilisez le paramètre de requête "include_docs" pour obtenir le document.
  2. Vous ne pouvez pas utiliser le paramètre clé ainsi que la startkey et endkey (il est en conflit)

Pour ce type de requête, vous avez principalement 3 solutions:

  1. Utilisez Mango Query et l'opérateur $ ou (vous voulez que la clé corresponde à "search" ou quelque chose entre 0 et 99)
  2. Faire deux requêtes (une qui cherche la clé "search" et l'autre avec les "startkey" et "endkey"
  3. Construire une vue spéciale à cette demande unique. Par exemple, si la chaîne de connexion est "search", émettez -1. Sinon, émettez le pourcentage d'inscription. Ensuite, interrogez witkey (-1) et endkey (99). Du côté client, gérez les valeurs -1 comme si elles étaient search.

Remarque: Comme pour la solution 3, il pourrait être poignée d'une autre façon, mais je l'ai fait de mon mieux avec les informations dont je.

+0

Pour 3, comment choisissez-vous d'émettre -1 lorsque la recherche est "recherche"? Pour autant que je sache, il n'y a aucun moyen de passer des arguments à la fonction 'map', donc je ne peux pas décider quand émettre -1 ou une autre valeur. Merci – OrangePot

+0

La fonction Emit est appelée à l'intérieur d'une fonction javascript. Donc vous pouvez faire si (loginstring == "search") emit (-1, val) –

+0

'" search "' est entré par l'utilisateur. Je ne peux pas le coder en dur dans le 'si 'comme vous l'avez fait – OrangePot