Как получить самую последнюю и самую старую запись в 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 );
}
);
}
Ответы
Ответ 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);
}
}
Это даст вам последний документ, записанный в базе данных. Просто следуйте той же концепции.