aquí es lo que hay que hacer.
función Mapa
function(doc)
{
if (doc.category)
{
emit(['category', doc.category], doc.modified);
}
}
entonces necesita una función de lista que los agrupa, es posible que se temped abusar de una reducir y hacer esto, pero es probable que generan errores a causa de no reducir suficientemente rápido con conjuntos grandes de datos.
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));
}
usted puede conseguir todas las categorías arriba 10 ahora con
http://localhost:5984/database/_design/doc/_list/top_ten/by_categories
y obtener los documentos con
http://localhost:5984/database/_design/doc/_list/top_ten/by_categories?include_docs=true
ahora se puede consultar esto con un POST de rango múltiple y el límite de las categorías
curl -X POST http://localhost:5984/database/_design/doc/_list/top_ten/by_categories -d '{"keys":[["category1"],["category2",["category3"]]}'
tampoco podría codificar el 10
y pasar el número a través de la variable req
.
Aquí hay más. Ver/Lista trickery.
¿Hay algún motivo por el que no desee hacerlo manualmente? Primera consulta para las categorías disponibles, luego consulta las listas por categoría. Hacer la segunda consulta por lotes, es casi como en la consulta. –
Puedo hacerlo así, pero mi pregunta es si algo así es posible en couchdb, en una consulta. Por ejemplo, uno puede hacer esto en SQL con una declaración de selección compleja anidada compleja. – drozzy