tutaj jest to, co trzeba zrobić.
funkcja Map
function(doc)
{
if (doc.category)
{
emit(['category', doc.category], doc.modified);
}
}
to trzeba funkcję listy, że grupy nich, może być temped nadużywać redukuj i to zrobić, ale to prawdopodobnie będzie rzucać błędów, nie zmniejszając wystarczająco szybko z dużych zbiorów danych.
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));
}
można uzyskać wszystkie kategorie Top 10 teraz z
http://localhost:5984/database/_design/doc/_list/top_ten/by_categories
i uzyskać dokumenty z
http://localhost:5984/database/_design/doc/_list/top_ten/by_categories?include_docs=true
teraz można wyszukać to z kilku zakresów POST i limitu które kategorie
curl -X POST http://localhost:5984/database/_design/doc/_list/top_ten/by_categories -d '{"keys":[["category1"],["category2",["category3"]]}'
nie można również zakodować kodu 10
i przekazać numeru za pomocą zmiennej req
.
Oto więcej Zobacz/List trickery.
Czy istnieje powód, dla którego nie chcesz robić tego ręcznie? Pierwsze zapytanie do dostępnych kategorii, następnie zapytaj listy według kategorii. Wykonuje załadowanie drugiego zapytania, czyli prawie jak w zapytaniu. –
Mogę to zrobić tak - ale moje pytanie brzmi, czy coś takiego jest możliwe w couchdb, w jednym zapytaniu. Na przykład można to zrobić w sql z naprawdę skomplikowaną zagnieżdżoną instrukcją select. – drozzy