2011-01-26 5 views
4

J'ai un Couchdb qui stocke des documents chacun de chacun a un champ de préfixe. Prefixes sont uniques afin qu'ils puissent effectivement être utilisés comme IDComment mettre en œuvre "correspondance partielle" dans la requête couchdb

Dis:


_id=1 {prefix="AAABBBCCC", ...} 
_id=2 {prefix="AAABBBDDD", ...} 
_id=3 {prefix="AAABBE", ...} 
_id=4 {prefix="AAAFF", ...} 

Je dois interroger ces documents récupérer un document approprié (toujours un match complet sur le préfixe) en utilisant une clé qui est plus longue, mais correspond complètement au préfixe. La longueur du préfixe varie, la longueur de la clé est constante.


query_key = AAABBBCCC123 => _id1 
query_key = AAABBBDDD456 => _id2 
query_key = AAABBEEEEEEE => _id3 
query_key = AAABxxxxxxxx => Null 

Toute idée de comment cela peut-il être fait Couch?

+0

Que se passe-t-il s'il existe à la fois 'AAABBBCCC' et' AAABBBCCC12' et que vous faites une requête pour 'AAABBBCCC123'. Lequel est la bonne réponse? Ou est-ce impossible? – JasonSmith

Répondre

2

Faire une vue émettant doc.prefix. Ensuite, interrogez en descendant avec startkey défini sur votre clé de requête avec limit=1. Le préfixe résultant peut être être le vôtre, mais vous devez confirmer.

Vous pouvez confirmer le préfixe dans le client ou avec une fonction _list. Une fonction _list n'aide probablement pas avec la performance donc je considérerais le faire dans le client, à moins que vous ayez beaucoup de clients dans beaucoup de langues, et vous pouvez standardiser sur une URL simple pour interroger avec la même sortie.

+0

Oh wow, je viens de voir ton commentaire avec la même technique. Pardon. – JasonSmith

+0

Je vais vous donner le point cependant - ne savais pas sur la _list, merci! – tbikeev

0

La fonction carte devrait ressembler à ceci

function(doc) { 
    emit(doc.prefix, doc); 
} 

et vous devez rechercher des documents avec la fonction de sous-chaîne dans la clé.

Comme ceci:

_design/doc/_view/viewname?key=QUERY_KEY.substring(0, FIXED_KEY_LENGTH) 
+0

Je ne sais pas sur la sous-chaîne, de toute façon je ne connaîtrai jamais FIXED_KEY_LENGTH à l'avance ... Je l'ai eu à travers .../_ view/QUERY_NAME? Startkey = "query_key" & descending = true & limit = 1 cela me donne le dernier préfixe apparié, j'ai juste besoin de vérifier si le préfixe est réellement contenu dans la clé de la requête (côté client pour le moment). – tbikeev

Questions connexes