33 votes

Tri et filtrage CouchDB 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"
    ],
}

À partir 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?

49voto

Sam Bisbee Points 3085

Pour l'émission de plus d'un élément de données dans une clé, vous aurez envie de lire sur les Complexes des Touches de http://wiki.apache.org/couchdb/View_collation 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...

function(doc) {
  for(var i = 0; i < doc.tags.length; i++)
    emit([doc.category, doc.tags[i]], doc);
}

Maintenant, quand vous interrogez ?key=["fun", "couchdb"] vous aurez tous les éléments dans le plaisir de la catégorie étiqueté comme couchdb. 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 que vous aurez à plusieurs reprises dans les résultats (parce que vous émettez()'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 émettre() plus d'une fois par carte de fonction. Un exemple de carte de fonction...

function(doc) {
  for(var i = 0; i < doc.tags.length; i++)
  {
     emit([doc.category, doc.tags[i], 0, doc.ranking], doc);
     emit([doc.category, doc.tags[i], 1, doc.title], doc);
     emit([doc.category, doc.tags[i], 2, doc.date], doc);
  }
}

Maintenant, votre clé de la structure: ["catégorie", "tag", 0 ... 2, rang/titre/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 le plaisir de la catégorie avec la couchdb balise (par ordre croissant):

?startkey=["fun", "couchdb"]&endkey=["fun", "couchdb", {}, {}]

Obtenir tout le plaisir de la catégorie avec la couchdb tag (décroissant):

?startkey=["fun", "couchdb", {}, {}]&endkey=["fun", "couchdb"]&descending=true

Obtenez uniquement les classements dans le plaisir de la catégorie avec la couchdb balise (par ordre croissant):

?startkey=["fun", "couchdb", 0]&endkey=["fun", "couchdb", 0, {}]

Obtenez uniquement les classements dans le plaisir de la catégorie avec la couchdb tag (décroissant):

?startkey=["fun", "couchdb", 0, {}]&endkey=["fun", "couchdb", 0]&descending=true

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.

Des acclamations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X