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

新手上路,请多包涵

基本问题

我有一堆记录,我需要获取最新的(最近的)和最旧的(最近的)。

谷歌搜索时,我发现 了这个主题,其中我看到了几个查询:

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

原文由 askmike 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 306
2 个回答

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

试试这个而不是找到最新的:

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

-1 1 以找到最旧的。

但是因为您没有使用任何字段选择,所以将几个调用链接在一起会更简洁:

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

或者甚至将字符串传递给 sort

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

原文由 JohnnyHK 发布,翻译遵循 CC BY-SA 4.0 许可协议

快速简单 - 一条线解决方案

获取 10 latest documents

 MySchema.find().sort({ _id: -1 }).limit(10)

获取 10 oldest documents

 MySchema.find().sort({ _id: 1 }).limit(10)

如果您想根据其他一些属性进行排序,即 createdAt 并获取最旧或最新的。它类似于上面的查询。

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

原文由 WasiF 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题