J'ai un tas de disques et j'ai besoin d'obtenir le plus récent (le plus récent) et le plus ancien (le moins récent).
Lorsque j'ai googlé, j'ai trouvé ce sujet où j'ai vu quelques requêtes:
// 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 );
});
Malheureusement ils se trompent tous les deux:
TypeError: Invalid select() argument. Must be a string or object.
Le lien a aussi celui-ci:
Tweet.find().sort('_id','descending').limit(15).find(function(err, post) {
console.log( post );
});
et celui-là se trompe:
TypeError: Invalid sort() argument. Must be a string or object.
Alors, comment puis-je obtenir ces disques?
Encore plus idéalement, je veux juste la différence de temps (secondes?) Entre le plus ancien et le plus récent des disques, mais je ne sais pas comment commencer à faire une requête de ce type.
C'est le schéma:
var Tweet = new Schema({
body: String
, fid: { type: String, index: { unique: true } }
, username: { type: String, index: true }
, userid: Number
, created_at: Date
, source: String
});
Je suis à peu près sûr d'avoir la version la plus récente de mongoDB et mangouste.
Voici comment je calcule la durée sur la base de la réponse fournie par 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 );
}
);
}
Mongoose 3.x se plaint du paramètre []
dans vos appels findOne
car le format de tableau n'est plus pris en charge pour le paramètre qui sélectionne les champs à inclure.
Essayez plutôt ceci pour trouver le plus récent:
Tweet.findOne({}, {}, { sort: { 'created_at' : -1 } }, function(err, post) {
console.log( post );
});
Changez le -1
en 1
pour trouver le plus ancien.
Mais comme vous n'utilisez aucune sélection de champ, il est un peu plus simple d'enchaîner plusieurs appels:
Tweet.findOne().sort({created_at: -1}).exec(function(err, post) { ... });
Ou même passer une chaîne à sort
:
Tweet.findOne().sort('-created_at').exec(function(err, post) { ... });
pour la version ~ 3.8 mangouste
trouver la dernière entrée
model.findOne().sort({ field: 'asc', _id: -1 }).limit(1)
ou en utilisant
model.findOne().sort({ field: -_id }).limit(1)
Nous avons une méthode appelée sorte en utilisant que nous pouvons obtenir le premier élément (ancien document) qui signifie 1 pour le champ de tri ou dernier élément (nouveau document) qui signifie -1 pour le champ de tri de la collection.
collectionName.findOne().sort({$natural: -1}).limit(1).exec(function(err, res){
if(err){
console.log(err);
}
else{
console.log(res);
}
}
Cela vous donnera le dernier document enregistré dans la base de données. Suivez juste le même concept.