Javascript 如何在mongoose.js中获取最新和最旧的记录(或者只是它们之间的时间跨度) 基本问题

Javascript 如何在mongoose.js中获取最新和最旧的记录(或者只是它们之间的时间跨度) 基本问题,javascript,node.js,mongoose,timespan,Javascript,Node.js,Mongoose,Timespan,我有一堆记录,我需要得到最新的(最近的)和最旧的(最近的) 在谷歌搜索时,我发现了几个问题: // option 1 Tweet.findOne({}, [], { $orderby : { 'created_at' : -1 } }, function(err, post) { console.log( post ); }); // option 2 Tweet.find({}, [], {sort:[['arrival',-1]]}, function(err, post) { co

我有一堆记录,我需要得到最新的(最近的)和最旧的(最近的)

在谷歌搜索时,我发现了几个问题:

// 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.
那我怎么才能得到那些记录呢

时间跨度 更理想的是,我只想知道最旧记录和最新记录之间的时间差(秒?),但我不知道如何开始这样的查询

这是模式:

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

Mongoose 3.x正在抱怨调用中的
[]
参数,因为选择要包含的字段的参数不再支持数组格式

请尝试以下方法查找最新的:

Tweet.findOne({}, {}, { sort: { 'created_at' : -1 } }, function(err, post) {
  console.log( post );
});
-1
更改为
1
,以查找最旧的

但是,由于您没有使用任何字段选择,因此将两个调用链接在一起会更简洁:

Tweet.findOne().sort({created_at: -1}).exec(function(err, post) { ... });
或者甚至将字符串传递给:


对于版本~3.8的猫鼬

查找最后一个条目

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

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

我们有一个名为sort的方法,我们可以获取第一个元素(旧文档),这意味着排序字段为1,或者最后一个元素(新文档),这意味着集合的排序字段为-1

collectionName.findOne().sort({$natural: -1}).limit(1).exec(function(err, res){
    if(err){
        console.log(err);
    }
    else{
        console.log(res);
    }
}
这将为您提供数据库中记录的最后一个文档。只需遵循相同的概念。

快速简单-单线解决方案 获取10份最新文档

MySchema.find().sort({ _id: -1 }).limit(10)
MySchema.find().sort({ _id: 1 }).limit(10)
获取10个最早的文档

MySchema.find().sort({ _id: -1 }).limit(10)
MySchema.find().sort({ _id: 1 }).limit(10)
如果您希望基于其他属性(即
createdAt
)进行排序,并获取最早或最新的属性。同样,它与上面的查询类似

MySchema.find().sort({ createdAt: 1 }).limit(10)  // oldest docs
MySchema.find().sort({ createdAt: -1 }).limit(10) // latest docs

这个适合我。使用mongodb natural order

我不认为您可以在一个查询中完成。并行查询最小值和最大值,然后在两个查询完成后计算时间跨度。我尝试了这个查询,但是'created_at':-1或'created_at':1都返回最早的记录,为什么?我的mongoose api版本是3.8.x此方法是一个旧版本,现在3.8 mongoose使用
model.findOne().sort({field:'asc',_id:-1})。limit(1)
查找最后一个条目或
model.findOne().sort({field:-_id})。limit(1)
@atom2ueki-请将此作为答案而不是评论发布。这是我个人首选的解决方案,如果你真的创建了它,我会给你的答案投票。在
\u id
上排序比在
创建的
上排序要快(因为索引)没有
限制(1)
冗余,因为你已经在使用
findOne()
而不是
find()
?我使用了
MySchema.find({…}).sort({createdAt:-1})[0]
以获取最新的insert和yout查询要快得多。谢谢,谢谢。你知道如何按
createdAt
排序最后10条记录吗?@哲学家我已经更新了答案来回答你的问题。我还没有测试过它,如果它不起作用或者需要改进,一定要告诉我。@was如果我的意思是如果我想要以不变的顺序返回的文档,该怎么办。不管怎么说,我找到了解决办法,我所做的是在使用Lodash的sortBy返回后对它们进行排序。这就是我要寻找的。