Je suis à la recherche d'un équivalent CouchDB aux "jointures SQL".
Dans mon exemple, il y a des documents CouchDB qui sont des éléments de liste :
{ "type" : "el", "id" : "1", "content" : "first" }
{ "type" : "el", "id" : "2", "content" : "second" }
{ "type" : "el", "id" : "3", "content" : "third" }
Il existe un document qui définit la liste :
{ "type" : "list", "elements" : ["2","1"] , "id" : "abc123" }
Comme vous pouvez le constater, le troisième élément a été supprimé, il ne fait plus partie de la liste. Il ne doit donc pas faire partie du résultat. Maintenant, je veux une vue qui retourne les éléments de contenu en incluant le bon ordre.
Le résultat pourrait être :
{ "content" : ["second", "first"] }
Dans ce cas, l'ordre des éléments est déjà ce qu'il devrait être. Un autre résultat possible :
{ "content" : [{"content" : "first", "order" : 2},{"content" : "second", "order" : 1}] }
J'ai commencé à écrire la fonction map :
map = function (doc) {
if (doc.type === 'el') {
emit(doc.id, {"content" : doc.content}); //emit the id and the content
exit;
}
if (doc.type === 'list') {
for ( var i=0, l=doc.elements.length; i<l; ++i ){
emit(doc.elements[i], { "order" : i }); //emit the id and the order
}
}
}
C'est le plus loin que je puisse aller. Pouvez-vous corriger mes erreurs et écrire une fonction de réduction ? N'oubliez pas que le troisième document ne doit pas faire partie du résultat.
Bien sûr, vous pouvez aussi écrire une autre fonction de carte. Mais la structure des documents (un document d'élément de définition et un document d'entrée pour chaque entrée) ne peut pas être modifiée.
EDIT : Ne manquez pas le commentaire de JasonSmith à sa réponse, où il décrit comment faire plus court.