CouchDB de tri et de filtrage dans la même vue
Je suis en train d'utiliser CouchDB pour une nouvelle application, et j'ai besoin de créer une vue qui trie par de multiples domaines et des filtres en fonction de plusieurs champs. Voici un exemple de document, j'ai laissé de côté l'_id et _rev pour me sauver un peu de temps.
{
"title": "My Document",
"date": 1279816057,
"ranking": 5,
"category": "fun",
"tags": [
"couchdb",
"technology"
],
}
De la documentation, j'ai appris que je peux facilement créer une vue qui trie par un domaine tel que le classement.
function(doc) {
emit(doc.ranking, doc);
}
J'ai également appris que je peux facilement filtrer par domaines tels que la catégorie
function(doc) {
emit(doc.category, doc);
}
http://127.0.0.1:5984/database/_design/filter/_view/filter?key=%22fun%22
Mon problème est que j'ai besoin de faire un tas de toutes ces choses en même temps. Je veux du filtre en fonction de la catégorie et aussi la marque. Je devrais être en mesure de filtrer uniquement les documents avec la catégorie de "fun" et la balise de "documents". Je veux trier les résultats filtrés par le classement dans l'ordre décroissant, puis par date dans l'ordre croissant, puis par titre dans l'ordre alphabétique.
Comment puis-je créer une vue qui fait tout de tri et de filtrage?
Vous devez vous connecter pour publier un commentaire.
Pour l'émission de plus d'un élément de données dans une clé, vous aurez envie de lire sur Complexe Clés. Vous aurez plus de chances de finir
emit()
'ing une clé qui est un tableau composé de la catégorie et de la balise. Par exemple...Maintenant, quand vous interrogez
?key=["fun", "couchdb"]
vous aurez tous les éléments dans le plaisir de la catégorie tagged avec "documents". Ou si vous voulez tous les éléments dans le plaisir de la catégorie, quelle que soit leur étiquette, alors vous pouvez faire une requête avec une gamme:?startkey=["fun"]&endkey=["fun", {}]
. Rappelez-vous juste, si votre article a plusieurs balises, vous l'aurez plusieurs fois dans les résultats (parce que vousemit()
'd la doc une fois par tag).Pour passer à la deuxième étape de tri par note, la date et le titre que vous allez ajouter deux autres éléments de votre tableau: un entier et soit le classement, la date ou par titre. N'oubliez pas, vous pouvez
emit()
plus d'une fois par carte de fonction. Un exemple de carte de fonction...Maintenant votre clé de la structure:
["category", "tag", 0 ... 2, rank/title/date]
Vous êtes essentiellement en regroupant l'ensemble des classements au-dessous de 0, les titres de moins de 1, et les dates de moins de 2. Bien sûr, vous êtes la transmission d'un grand nombre de données, de sorte que vous pourrait interrompre chacun de ces groupements dans une vue séparée dans votre document de conception, ou de retourner uniquement le doc de
_id
la valeur (emit([ ...], doc._id);
).Obtenir tout dans le "fun" catégorie "documents" de la balise (ascendant):
Obtenir tout dans le "fun" catégorie "documents" de la balise (descente):
Obtenir uniquement les classements dans le plaisir de la catégorie avec la couchdb tag (ascendant):
?startkey=["fun", "couchdb", 0]&endkey=["fun", "couchdb", 0, {}]
Seulement obtenir le classement "fun" catégorie "documents" de la balise (descente):
J'espère que cette aide. Complexe touches de vraiment commencer à montrer comment puissant Map/reduce est à découper et couper en dés les données.
Acclamations.