findbyid false created collection attribute javascript node.js mongoose timespan

javascript - false - mongoose npm



Cómo obtener el último y más antiguo registro en mongoose.js(o solo el intervalo de tiempo entre ellos) (2)

Mongoose 3.x se queja del parámetro [] en sus llamadas a findOne ya que el formato de matriz ya no es compatible con el parámetro que selecciona los campos para incluir.

Pruebe esto en su lugar para encontrar el más nuevo:

Tweet.findOne({}, {}, { sort: { ''created_at'' : -1 } }, function(err, post) { console.log( post ); });

Cambia el -1 a un 1 para encontrar el más antiguo.

Pero como no está utilizando ninguna selección de campo, es bastante más limpio encadenar un par de llamadas juntas:

Tweet.findOne().sort({created_at: -1}).exec(function(err, post) { ... });

O incluso pasar una cadena para sort :

Tweet.findOne().sort(''-created_at'').exec(function(err, post) { ... });

Problema básico

Tengo muchos registros y necesito obtener los últimos (más recientes) y los más antiguos (menos recientes).

Cuando busqué en Google, encontré este tema donde vi un par de consultas:

// option 1 Tweet.findOne({}, [], { $orderby : { ''created_at'' : -1 } }, function(err, post) { console.log( post ); }); // option 2 Tweet.find({}, [], {sort:[[''arrival'',-1]]}, function(err, post) { console.log( post ); });

Desafortunadamente ambos cometieron un error:

TypeError: Invalid select() argument. Must be a string or object.

El enlace también tiene este:

Tweet.find().sort(''_id'',''descending'').limit(15).find(function(err, post) { console.log( post ); });

y ese único error:

TypeError: Invalid sort() argument. Must be a string or object.

Entonces, ¿cómo puedo obtener esos registros?

Espacio de tiempo

Aún más idealmente, solo quiero la diferencia en el tiempo (¿segundos?) Entre el registro más antiguo y el más nuevo, pero no tengo idea de cómo empezar a hacer una consulta como esa.

Este es el esquema:

var Tweet = new Schema({ body: String , fid: { type: String, index: { unique: true } } , username: { type: String, index: true } , userid: Number , created_at: Date , source: String });

Estoy bastante seguro de que tengo la versión más reciente de mongoDB y mangosta.

EDITAR

Así calculo el tiempo según la respuesta proporcionada por JohnnyHK:

var calcDays = function( cb ) { var getOldest = function( cb ) { Tweet.findOne({}, {}, { sort: { ''created_at'' : 1 } }, function(err, post) { cb( null, post.created_at.getTime() ); }); } , getNewest = function( cb ) { Tweet.findOne({}, {}, { sort: { ''created_at'' : -1 } }, function(err, post) { cb( null, post.created_at.getTime() ); }); } async.parallel({ oldest: getOldest , newest: getNewest } , function( err, results ) { var days = ( results.newest - results.oldest ) / 1000 / 60 / 60 / 24; // days = Math.round( days ); cb( null, days ); } ); }


para la versión ~ 3.8 de mangosta

para encontrar la última entrada

model.findOne().sort({ field: ''asc'', _id: -1 }).limit(1)

o usando

model.findOne().sort({ field: -_id }).limit(1)