67

基本問題

たくさんのレコードがあり、最新 (最新) と最も古い (最も古い) レコードを取得する必要があります。

グーグルで検索すると、いくつかのクエリが表示されたこのトピックが見つかりました。

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

8 に答える 8

129

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) { ... });
于 2012-09-17T21:16:48.703 に答える
49

迅速かつシンプル - ワン ライン ソリューション

得る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
于 2019-02-18T06:15:55.890 に答える
1

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

于 2018-10-12T03:24:43.707 に答える
0

これが async の答えです - await

const olderDoc: any = await Model.findOne().sort({ createdAt: 1 }).lean().exec()
console.log('olderDoc', olderDoc)

const newerDoc: any = await Model.findOne().sort({ createdAt: -1 }).lean().exec()
console.log('newerDoc', newerDoc)
于 2021-12-15T11:24:10.243 に答える