web-dev-qa-db-ja.com

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

そしてその1つのエラー:

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

Mongoose 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) { ... });
78
JohnnyHK

mongoose 5.4.xでテスト済み

取得する - 10 latest documents

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

取得する - 10 oldest documents

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

バージョン〜3.8のマングース

最後のエントリを見つける

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

またはを使用して

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

最初の要素(古いドキュメント)を取得できるsortというメソッドがあります。これは、sortフィールドの1を意味しますまたは最後の要素(新しいドキュメント)は、コレクションのソートフィールドに-1を意味します。

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

これにより、データベースに記録された最後のドキュメントが得られます。同じコンセプトに従ってください。

0