2010-04-06 13 views
10

¿Cómo puedo ejecutar una consulta equivalente a "seleccionar las 10 principales" en el sofá db?Seleccionar top/latest 10 en couchdb?

Por ejemplo, tengo un "esquema" de esta manera:

title body modified 

y quiero seleccionar los últimos 10 documentos modificados.

Como una ventaja adicional si alguien puede encontrar la manera de hacer lo mismo solo por categoría. Entonces para:

title category body modified 

devuelve una lista de los últimos 10 documentos en cada categoría.

Me pregunto si tal consulta es posible en couchdb.

+0

¿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. –

+0

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

Respuesta

3

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.

+0

Genial, lo probaré y te responderé! – drozzy

+0

No probé esta respuesta, pero la aceptaré de todos modos ya que no trabajo con couchdb. – drozzy

7

Para obtener los primeros 10 documentos de su base de datos puede usar la opción de consulta límite. P. ej. llamando al

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?limit=10 

Obtiene los primeros 10 documentos.

Ver filas se ordenan por la clave; agregar descendente = verdadero en la cadena de consulta invertirá su orden. También puede emitir solo los documentos que le interesan usando nuevamente la cadena de consulta para seleccionar las claves que le interesan. Así que, en su opinión que escribe su función de mapa como:

function(doc) { 
    emit([doc.category, doc.modified], doc); 
} 

Y su búsqueda de esta manera:

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?startkey=["youcategory"]&endkey=["youcategory", date_in_the_future]&limit=10&descending=true 
+0

¿Esa segunda consulta realmente seleccionará los últimos 10 artículos en Cada una de las categorías? ¿O solo los últimos 10 artículos de una categoría? – drozzy

+0

¡Vaya! Leí mal tu pregunta. Selecciona los últimos 10 artículos de una categoría. – filippo

0

corrección leve. no estaba ordenando hasta que agregué la palabra clave "return" en su función sortCategory.Debe ser así:

function sortCategory(a,b) { return b.value - a.value; }