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)