Mongooseでは、日付で並べ替える方法を教えてください。(node.js)


回答:


427

Mongooseでの並べ替えはリリース全体にわたって進化しており、これらの回答の一部は無効になっています。Mongoose の4.1.xリリース以降dateフィールドの降順ソートは次のいずれかの方法で実行できます。

Room.find({}).sort('-date').exec(function(err, docs) { ... });
Room.find({}).sort({date: -1}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'desc'}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'descending'}).exec(function(err, docs) { ... });
Room.find({}).sort([['date', -1]]).exec(function(err, docs) { ... });
Room.find({}, null, {sort: '-date'}, function(err, docs) { ... });
Room.find({}, null, {sort: {date: -1}}, function(err, docs) { ... });

昇順ソートの場合、省略-の文字列バージョンまたは使用価値の接頭辞1ascまたはをascending


1
+1を使用すると、さまざまな方法でさまざまなことができます。ただし、Query#findがそのように多くの引数を取ることをドキュメントで見つけることはできません。署名はQuery#find([criteria], [callback])です。「条件」には最大3つの引数を指定できるという秘密のハンドシェイクがあるかもしれないと思いましたが、タイプは「オブジェクト」としてリストされています。
Nateowami 2017

@Nateowamiあなたはfindドキュメントで間違ったメソッドを見ています。を参照してくださいModel.find
JohnnyHK

1
あなたが正しい。彼らがそのModule#property表記法を使っているのを見て、を検索しました#find。ドキュメントをナビゲートまたは検索する簡単な方法はないようです。findを検索すると187件の結果が得られます。
なてわみ2017

1
_idフィールドで並べ替えることもできます。例えば、最新のレコードを取得するために、あなたが行うことができます:await db.collection.findOne().sort({ _id: -1 });
マイクK


12

今日、Mongoose 3.5(.2)を使用してこの問題に対処してきましたが、どの回答もこの問題の解決に役立ちませんでした。次のコードスニペットは、トリックを行います

Post.find().sort('-posted').find(function (err, posts) {
    // user posts array
});

必要な標準パラメーターfind()(where句やreturnフィールドなど)は送信できますがコールバックは送信できません。コールバックなしでは、連鎖するQueryオブジェクトを返しますsort()find()コールバックで結果セットを取得できるようにするために、再度呼び出す必要があります(パラメーターを追加するかどうかにかかわらず、効率上の理由から何も必要ありません)。


4

私はこれをします:

Data.find( { $query: { user: req.user }, $orderby: { dateAdded: -1 } } function ( results ) {
    ...
})

これにより、最新のものが最初に表示されます。


1
$orderbyMongoDB 3.2では非推奨であるため、今後は使用しないでください。
JohnnyHK

4
Post.find().sort({date:-1}, function(err, posts){
});

同様に動作するはずです

編集:

エラーが発生した場合は、これを使用することもできますsort() only takes 1 Argument

Post.find({}, {
    '_id': 0,    // select keys to return here
}, {sort: '-date'}, function(err, posts) {
    // use it here
});

1
これは私にエラーを与えます:Error: sort() only takes 1 Argument
mrid

@LukeXFは更新された回答を参照してください。私はそれがあなたに役立つことを願っています:)
mrid

@mridそれは次のようにする必要があります: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
ムスタファGhadimi

2

短い解決策:

const query = {}
const projection = {}
const options = { sort: { id: 1 }, limit: 2, skip: 10 }

Room.find(query, projection, options).exec(function(err, docs) { ... });

1

その最初の方法は機能しません。ハングするだけです...私はそれはマングースの更新によるものだと思います...そして、2番目の方法は私が知っているモンゴのドキュメントです。
TIMEX

find()関数はMongoDBではなく、Mongooseの関数です。詳細については、Mongoose APIページをご覧ください。Mongooseでは、MongoDBドキュメントで定義された構文を使用できます。そのため、Mongooseには独自の並べ替えや交差クエリがありません。
neebz

0

_idフィールドで並べ替えることもできます。たとえば、最新のレコードを取得するには、次のようにします。

const mostRecentRecord = await db.collection.findOne().sort({ _id: -1 });

あなたのdateフィールドがインデックス化されていないことを私は賭けるよりもずっと速いので、それもはるかに速いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.