2012-06-06 82 views
53

Quiero saber el registro más reciente de una colección. ¿Como hacer eso?Obtiene el último registro de la colección mongodb

Nota: Sé que la línea de comandos siguientes consultas obras:

1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson); 
2. db.test.find().skip(db.test.count()-1).forEach(printjson) 

donde idate tiene la marca de tiempo añadido.

El problema es más largo, la colección es el momento de recuperar los datos y mi colección de "pruebas" es realmente muy grande. Necesito una consulta con respuesta de tiempo constante.

Si hay una mejor consulta de la línea de comandos de mongodb, házmelo saber.

Respuesta

17

necesito una consulta con la respuesta constante de tiempo

Por defecto, los índices en MongoDB son B-Trees. La búsqueda de un B-Tree es una operación O (logN), por lo que incluso find({_id:...}) no proporcionará respuestas de tiempo constante, O (1).

Dicho esto, también puede ordenar por _id si está utilizando ObjectId para su identificación. See here for details. Por supuesto, incluso eso solo es bueno hasta el último segundo.

Puede recurrir a "escribir dos veces". Escriba una vez en la colección principal y escriba nuevamente en una colección "actualizada por última vez". Sin transacciones, esto no será perfecto, pero con solo un elemento en la colección "última actualización" siempre será rápido.

+2

Veo una gran cantidad de soluciones NoSQL y MongoDB abogando por "escrito en dos ocasiones", sobre todo para los titulares de cuenta a la hora el tamaño de los datos se vuelve muy grande. ¿Supongo que esto es una práctica común? – Vinny

+0

MongoDB no se descarga al disco con mucha frecuencia y no tiene transacciones, por lo que las escrituras se vuelven significativamente más rápidas. La compensación aquí es que se le anima a des-normalizar los datos que a menudo conduce a múltiples escrituras. Por supuesto, si obtienes un rendimiento de escritura de 10x o 100x (que he visto), entonces las escrituras 2x o 3x siguen siendo una gran mejora. –

14

Esto le dará un último documento para un collection

db.collectionName.findOne({}, {sort:{$natural:-1}}) 

$natural:-1 significa orden inverso al que los registros se insertan en

Editar:. Para todos los downvoters, de arriba es una Sintaxis de Mongoose, sintaxis de mongo CLI es: db.collectionName.find({}).sort({$natural:-1}).limit(1)

+6

Parece que su sintaxis es incorrecta. No puedo hacer que funcione como lo tienes. Lo que funciona es: 'db.punchdeck.findOne ({$ query: {}, $ orderby: {$ natural: -1}}) ' –

+0

no estoy seguro, por qué todos los votos a favor - este código funciona perfectamente para mí, y es rápido –

+1

@dark_ruby Consulta el error de devoluciones "$ err ":" No se puede canonicalizar la consulta: BadValue Opción de proyección no admitida: sort: {$ natural: -1.0} ", –

78

Esto es una repetición de la respuesta anterior, pero es más probable que w ork en diferentes versiones de mongodb.

db.collection.find().limit(1).sort({$natural:-1}) 
+6

' db.collection.find(). limit (1) .sort ({$ natural: -1}) .pretty() 'si quiere que se vea bien – Antoine

+0

Entonces, ¿cuál es la diferencia con este orden:' '' db.collection.find(). sort ({$ natural: -1}). limit (1). pretty() '' ' – Leo

+0

@Digits qué impacto tendrá en el rendimiento si ponemos límite al final también cómo se obtiene el último registro cuando está limitando la salida a solo un documento y debe ser el documento superior en la colección. –

-1

php7.1 MongoDB:
$data = $collection->findOne([],['sort' => ['_id' => -1],'projection' => ['_id' => 1]]);

0

Mi Solución:

db.collection("name of collection").find({}, {limit: 1}).sort({$natural: -1})

Cuestiones relacionadas