voici ce que vous devez faire.
fonction de la carte
function(doc)
{
if (doc.category)
{
emit(['category', doc.category], doc.modified);
}
}
alors vous avez besoin d'une fonction de liste qui les groupes, vous pourriez temped d'abuser d'un réduire et faire cela, mais il sera probablement jeter des erreurs en raison de ne pas réduire assez vite avec de grands ensembles de données.
function(head, req)
{
% this sort function assumes that modifed is a number
% and it sorts in descending order
function sortCategory(a,b) { b.value - a.value; }
var categories = {};
var category;
var id;
var row;
while (row = getRow())
{
if (!categories[row.key[0]])
{
categories[row.key[0]] = [];
}
categories[row.key[0]].push(row);
}
for (var cat in categories)
{
categories[cat].sort(sortCategory);
categories[cat] = categories[cat].slice(0,10);
}
send(toJSON(categories));
}
vous pouvez obtenir toutes les catégories top 10 maintenant avec
http://localhost:5984/database/_design/doc/_list/top_ten/by_categories
et obtenir la documentation avec
http://localhost:5984/database/_design/doc/_list/top_ten/by_categories?include_docs=true
maintenant vous pouvez interroger ce avec une gamme multiple POST et limite les catégories
curl -X POST http://localhost:5984/database/_design/doc/_list/top_ten/by_categories -d '{"keys":[["category1"],["category2",["category3"]]}'
vous pouvez également ne pas coder le 10
et transmettre le nombre à travers la variable req
.
Voici un peu plus Voir/Liste trickery.
Y a-t-il une raison pour laquelle vous ne voulez pas le faire manuellement? Première requête pour les catégories disponibles, puis interrogez les listes par catégorie. Faire la deuxième requête par lot, c'est presque comme sur la requête. –
Je peux le faire oui - mais ma question est de savoir si quelque chose comme ceci est possible dans couchdb, dans une requête. Par exemple, on peut le faire en sql avec une instruction select imbriquée complexe complexe. – drozzy