たくさんのレコードがあり、最新(最新)と最古(最新)を取得する必要があります。
グーグルで見つけた このトピック いくつかのクエリを見た場所:
// 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 );
}
);
}
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) { ... });
mongoose 5.4.xでテスト済み
取得する - 10 latest documents
MySchema.find().sort({ _id: -1 }).limit(10)
取得する - 10 oldest documents
MySchema.find().sort({ _id: 1 }).limit(10)
バージョン〜3.8のマングース
最後のエントリを見つける
model.findOne().sort({ field: 'asc', _id: -1 }).limit(1)
またはを使用して
model.findOne().sort({ field: -_id }).limit(1)
最初の要素(古いドキュメント)を取得できるsortというメソッドがあります。これは、sortフィールドの1を意味しますまたは最後の要素(新しいドキュメント)は、コレクションのソートフィールドに-1を意味します。
collectionName.findOne().sort({$natural: -1}).limit(1).exec(function(err, res){
if(err){
console.log(err);
}
else{
console.log(res);
}
}
これにより、データベースに記録された最後のドキュメントが得られます。同じコンセプトに従ってください。