一尘不染

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

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

阅读 191

收藏
2020-07-07

共1个答案

一尘不染

猫鼬3.X的抱怨[]在参数findOne调用的阵列格式不再支持的参数选择的领域包括。

尝试使用此方法来查找最新的:

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

更改-11找到最古老的。

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

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

甚至将字符串传递给sort

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