2012-10-17 3 views
3

J'ai une question pour couchdb views/map-reduce.CouchDB View - Filtre multiple

Disons, nous avons une base de données avec l'hôtel-documents comme les suivants:

[{ 
     _id: "1", 
     name: "Hotel A", 
     type: "hotel", 
     stars: 3, 
     flags: ["family-friendly","green-hotel","sport"], 
     hotelType: "premium", 
     food: ["breakfast","lunch"] 
    }, { 
     _id: "2", 
     name: "Hotel B", 
     type: "hotel", 
     stars: 5, 
     flags: ["family-friendly","pet-friendly"], 
     hotelType: "budget", 
     food: ["breakfast","lunch","dinner"] 
    }] 

Pour trouver tous les hôtels avec 3 étoiles, la vue suivante s'adaptera:

function(doc) { 
    emit([doc.stars, doc.name]); 
} 

Si je startkey = [3], tout va bien.

Mais comment est-il possible de faire une vue avec plusieurs filtres?

Par exemple - Tous les hôtels:

  • avec 3 étoiles et les drapeaux « la famille » et « animaux de compagnie » et avec Type d'hôtel « budget »?
  • avec hotelType "premium" et nourriture "petit déjeuner" ou "déjeuner"?
  • etc.

Toutes les idées?

EDIT: J'ai maintenant décidé d'utiliser le bon vieux mysql. CouchDB a été une expérience agréable pour moi, mais il y a trop de problèmes si vous avez besoin de plus de données qu'un seul document :(

Répondre

1

Vous devez utiliser différentes vues pour cela, chaque vue gérera son propre domaine avec ses propres clés. vous pouvez créer une vue pour toutes-données via plusieurs émettent avec différentes valeurs key, mais en perspective, il sera difficile de maintenir

1

vous pouvez émettre une clé avec un groupe de valeurs.

emit([[doc.stars,doc.hotelType], doc.name]); 

Le problème est que cela ne fonctionne que si vous pouvez ordonner vos attributs par importance car ils seront toujours réduits dans le même ordre. La solution de xepal consistant à utiliser des vues différentes est probablement la meilleure pour votre situation.

Source: http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Grouping

+0

Merci pour vos commentaires. Je sais que je peux émettre plus d'une fois et que je peux utiliser des tableaux comme clés. fonction \t (doc) {// \t \t par nom \t \t Emit ([1, doc.prénom]); \t \t \t \t // by Type d'hôtel \t \t emit ([2, doc.hotelType]); \t \t \t \t // par des drapeaux \t \t for (var i in doc.flags) { \t \t \t emit ([3, doc.flags [i]]); \t \t} \t \t // par des étoiles et un seul drapeau (s) \t \t for (var i dans doc.flags) { \t \t \t Emit ([4, doc doc.flags [i].]); Mais comment puis-je rechercher par exemple "par étoiles et PLUS puis UN drapeaux"? y-a-t'il une solution? – bernhardh

+0

Ici dans un format lisible: http://pastebin.com/n8rsp87r – bernhardh

0

vues CouchDB sont unidimensionnels. Et vous êtes à la recherche pour la requête multi-dimensionnelle:

  • x =
  • étoiles
  • y = drapeaux
  • z =
  • Type d'hôtel

requêtes multidimensionnelles ne sont pas pris en charge malheureusement. Par exemple, si vous avez besoin d'une localisation géographique par latitude et longitude, vous devrez utiliser GeoCouch.

+0

Merci pour vos commentaires. Mais y a-t-il une solution à mon problème? N'utilisez pas couchdb? Utiliser une fonction de liste? etc ... – bernhardh

+1

Vous devez considérer une base de données SQL pour cette tâche. – Antonio

+1

Soit vous avez besoin de SQL pour pouvoir comparer deux valeurs indépendamment les unes des autres, soit vous devez créer une vue pour chaque combinaison de requête de recherche que vous voulez effectuer. CouchDB est comme ça par conception, de sorte qu'il peut être évolutif. – pokstad