回答:
質問を理解できたら、昇順に並べ替える必要があります。
「x」というIDまたは日付フィールドがあるとすると、...
db.foo.find().sort({x:1});
図1は、昇順に並べ替える(最も古い最新)とします-1ソート降順であろう(最新最古に)。
自動作成された_idフィールドを使用する場合は、日付が埋め込まれているので、それを使用して...で並べ替えることができます。
db.foo.find().sort({_id:1});
これにより、すべてのドキュメントが古いものから新しいものに戻されます。
上記の自然順を使用することもできます...
db.foo.find().sort({$natural:1});
この場合も、必要な順序に応じて1または-1を使用します。
最後に、この種のワイドオープンクエリを実行するときに制限を追加して、次のいずれかを実行できるようにすることをお勧めします。
db.foo.find().sort({_id:1}).limit(50);
または
db.foo.find().sort({$natural:1}).limit(50);
item = 3; item.add(3).divide(3) == 2; item.divide(3).add(3) == 4;
順序がなければ、結果はどうなるでしょうか??? この逆の順序は直感的ではないことに同意します。これはSQLではなく、通常のOOパラダイムに従う必要があります。
最近のN個の追加されたレコードは、次のクエリで確認できます。
db.collection.find().skip(db.collection.count() - N)
それらを逆の順序でしたい場合:
db.collection.find().sort({ $natural: -1 }).limit(N)
Mongo-Hackerをインストールすると、以下も使用できます。
db.collection.find().reverse().limit(N)
いつもこれらのコマンドを書くのに飽きたら、〜/ .mongorc.jsでカスタム関数を作成できます。例えば
function last(N) {
return db.collection.find().skip(db.collection.count() - N);
}
次に、mongoシェルから次のように入力します last(N)
db.collection.find().reverse().limit(1)
エラーが表示されます... has no method reverse
最後のNレコードを取得するには、クエリの下で実行できます。
db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)
最後のレコードが1つだけ必要な場合:
db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})
注:$ naturalの代わりに、コレクションの列の1つを使用できます。
クエリ:並べ替えと自然順序、http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order 、およびCursor Methods http://www.mongodb.org/displayの下のsort()を 参照してください。 / DOCS / Advanced + Queries
クエリの条件が考慮されないため、コレクションのサイズに基づいて「スキップ」することはできません。
正しい解決策は、目的のエンドポイントから並べ替え、結果セットのサイズを制限し、必要に応じて結果の順序を調整することです。
次に、実際のコードに基づく例を示します。
var query = collection.find( { conditions } ).sort({$natural : -1}).limit(N);
query.exec(function(err, results) {
if (err) {
}
else if (results.length == 0) {
}
else {
results.reverse(); // put the results into the desired order
results.forEach(function(result) {
// do something with each result
});
}
});
var query = collection.find( { conditions } ).sort({$natural : -1}).reverse().limit(N)
。
@ bin-chen、
コレクション内のドキュメントのサブセットの最新のnエントリの集計を使用できます。以下は、グループ化を行わない簡単な例です(この場合は、ステージ4と5の間で行います)。
これは、昇順でソートされた(「タイムスタンプ」と呼ばれるフィールドに基づく)最新の20エントリを返します。次に、各ドキュメントの_id、タイムスタンプ、whatever_field_you_want_to_showを結果に投影します。
var pipeline = [
{
"$match": { //stage 1: filter out a subset
"first_field": "needs to have this value",
"second_field": "needs to be this"
}
},
{
"$sort": { //stage 2: sort the remainder last-first
"timestamp": -1
}
},
{
"$limit": 20 //stage 3: keep only 20 of the descending order subset
},
{
"$sort": {
"rt": 1 //stage 4: sort back to ascending order
}
},
{
"$project": { //stage 5: add any fields you want to show in your results
"_id": 1,
"timestamp" : 1,
"whatever_field_you_want_to_show": 1
}
}
]
yourcollection.aggregate(pipeline, function resultCallBack(err, result) {
// account for (err)
// do something with (result)
}
したがって、結果は次のようになります。
{
"_id" : ObjectId("5ac5b878a1deg18asdafb060"),
"timestamp" : "2018-04-05T05:47:37.045Z",
"whatever_field_you_want_to_show" : -3.46000003814697
}
{
"_id" : ObjectId("5ac5b878a1de1adsweafb05f"),
"timestamp" : "2018-04-05T05:47:38.187Z",
"whatever_field_you_want_to_show" : -4.13000011444092
}
お役に立てれば。
コレクションのサイズによっては、ソート、スキップなどがかなり遅くなる場合があります。
コレクションをいくつかの基準でインデックス化すると、パフォーマンスが向上します。そして、あなたはmin()カーソルを使うことができます:
まず、コレクションにインデックスを付けます。db.collectionName.setIndex( yourIndex )
昇順または降順を使用できます。これは、常に「最後のN個のアイテム」が必要なため便利です。降順でインデックス付けすると、「最初のN個のアイテム」を取得するのと同じになります。 。
次に、コレクションの最初のアイテムを見つけ、そのインデックスフィールド値を次のような検索の最小基準として使用します。
db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)
これがmin()カーソルのリファレンスです:https : //docs.mongodb.com/manual/reference/method/cursor.min/
db.collectionName.find().hint(yourIndex).limit(N)
インデックスが降順の場合、Nの最小値を取得します。
find
オプションを使用したい場合があります:http :
//docs.meteor.com/api/collections.html#Mongo-Collection-find
db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)
mongoDBのドキュメントによると:
{$ natural:1}を指定して、クエリに強制的にフォワードコレクションスキャンを実行させることができます。
{$ natural:-1}を指定して、クエリで逆コレクションスキャンを強制的に実行することもできます。
$ slice演算子を使用して配列要素を制限する
GeoLocation.find({},{name: 1, geolocation:{$slice: -5}})
.then((result) => {
res.json(result);
})
.catch((err) => {
res.status(500).json({ success: false, msg: `Something went wrong. ${err}` });
});
ここで、地理位置情報はデータの配列であり、そこから最後の5つのレコードを取得します。
最後の関数はsort
でなくてでなければなりませんlimit
。
例:
db.testcollection.find().limit(3).sort({timestamp:-1});
sort
後になりlimit
ますか?