基本問題
たくさんのレコードがあり、最新 (最新) と最も古い (最も古い) レコードを取得する必要があります。
グーグルで検索すると、いくつかのクエリが表示されたこのトピックが見つかりました。
// 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 );
}
);
}