2011-08-12 9 views
5

Usar mysql esto sería:couchdb, acceder al último 10 documentos

SELECT * FROM thetable ORDER BY id DESC LIMIT 10 

¿Cómo puedo hacer esto en couchdb para todos los documentos con "type": "mensaje"? (Sin tirar todos los documentos con el tipo de mensaje:

)

, gracias

Respuesta

9

Crear una vista que emite todos los identificadores de doc. Las teclas de vista se usarán para ordenar automáticamente.

function(doc) { 
    if(doc.type && doc.type === 'message'){ 
     emit(doc._id, null); 
    } 
} 

a continuación, ejecutar una consulta: http://host/yourdb/_design/yourdesigndoc/_view/viewname?limit=10&include_docs=true&descending=true

porque desea que el documento completo, que no incluimos nada como el valor en la vista. En su lugar, agregamos include_docs=true para buscar cada documento completo para las entradas de la vista.

Tenga en cuenta que también hay una vista incorporado que hace lo mismo: http://host/yourdb/_all_docs?limit=10&include_docs=true&descending=true

PS: Usted debe ser consciente del hecho de que CouchDB por defecto usa UUID como identificadores, lo que hará que la clasificación más o menos inútil, si realmente quieres obtener los últimos documentos. Proporcione sus propios ID incrementales (¿qué ocurre con la distribución/replicación?) O utilice un nuevo campo que almacena la hora en que se ha creado el documento y también lo utiliza en la vista.


Si sus documentos tienen un created campo (es decir, marca de tiempo UNIX, JavaScript Date.now() o incluso una cadena de RFC 3339-como), se puede construir un índice en estos valores.

Aquí es la vista basada en el tiempo:

function(doc) { 
    if(doc.type && doc.type === 'message' && doc.created){ 
     emit(doc.created, null); 
    } 
} 

Tenga en cuenta que no vamos a emitir la doc._id sí. Sin embargo, CouchDB almacena el doc._id de donde provienen los datos para cada par clave/valor emitido automáticamente, por lo que podemos utilizar include_docs=true nuevamente para buscar los documentos completos.

de consulta http://host/yourdb/_design/yourdesigndoc/_view/viewname?limit=10&include_docs=true&descending=true

+0

Gracias por la respuesta. Sin embargo, al hacerlo, devolverá los 10 documentos más antiguos que contengan tipo: mensaje. Necesito los 10 documentos más nuevos. La única forma en que puedo pensar en hacer esto es extraer cada identificación de documento, tomar los últimos 10 identificadores de ese conjunto de resultados, y luego llamar los documentos directamente con los identificadores ... Simplemente no parece que sea la forma correcta de hacerlo eso. – Brian

+0

¿Has leído mi PS? Depende de cómo se generan/asignan sus doc._ids. Quizás deba cambiar a 'descendente = falso' o incluso agregar un campo generado a sus documentos y usarlo. –

+0

wow no, no, juro que lo he intentado 100 veces jaja ... no tengo idea de dónde lo eché a perder. ¡Gracias! – Brian

3

Si los ID de los documentos ya son incrementales, en lugar de los UUID por defecto de CouchDB, que ni siquiera es necesario definir un punto de vista, sólo se puede utilizar el valor predeterminado _all_docs vista, por ejemplo,

http://couchdb_host/your_db/_all_docs?limit=10&descending=true&include_docs=true 
Cuestiones relacionadas