Подтвердить что ты не робот

Как получить самую последнюю и самую старую запись в mongoose.js(или просто промежуток времени между ними)

Основная проблема

У меня есть куча записей, и мне нужно получить последние (самые последние) и самые старые (наименее недавние).

Когда googling нашел этот раздел, где я увидел пару запросов:

// 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 );
});

К сожалению, они оба ошибаются:

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

У этой ссылки также есть:

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

и что одна ошибка:

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

Итак, как я могу получить эти записи?

TimeSpan

Еще лучше я просто хочу разницу во времени (в секундах?) между самой старой и новейшей записью, но я не знаю, как начать делать такой запрос.

Это схема:

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

Я уверен, что у меня самая последняя версия mongoDB и mongoose.

ИЗМЕНИТЬ

Вот как я вычисляю время, основанное на ответе, предоставленном 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 );
    }
  );
}
4b9b3361

Ответ 1

Mongoose 3.x жалуется на параметр [] в ваших вызовах findOne, поскольку формат массива больше не поддерживается для параметра, который выбирает поля для включения.

Попробуйте вместо этого найти новейшее:

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

Измените -1 на a 1, чтобы найти самый старый.

Но поскольку вы не используете какой-либо выбор полей, он несколько чище, чтобы связать пару вызовов вместе:

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

Или даже передать строку в sort:

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

Ответ 2

для версии ~ 3.8 mongoose

чтобы найти последнюю запись

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

или используя

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

Ответ 3

У нас есть метод, называемый sort, с помощью которого мы можем получить первый элемент (старый документ), который означает 1 для поля сортировки, или последний элемент (новый документ), который означает -1 для поля сортировки коллекции.

Ответ 4

collectionName.findOne().sort({$natural: -1}).limit(1).exec(function(err, res){
    if(err){
        console.log(err);
    }
    else{
        console.log(res);
    }
}

Это даст вам последний документ, записанный в базе данных. Просто следуйте той же концепции.