web-dev-qa-db-fra.com

Comment obtenir l'enregistrement le plus récent et le plus ancien dans mongoose.js (ou simplement la période entre eux)

Problème de base

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?

Durée

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.

MODIFIER

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 );
    }
  );
}
32
askmike

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) { ... });
66
JohnnyHK

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)
4
atom2ueki

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.

0
KARTHIKEYAN.A
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.

0
Fabio do Nascimento