Mongoose'da tarihe göre nasıl sıralayabilirim? (Node.js)


161

Diyelim ki Mongoose'da bu sorguyu çalıştırıyorum:

Room.find({}, function(err,docs){

}).sort({date:-1}); 

Bu işe yaramıyor!

Yanıtlar:


429

Mongoose'daki sıralama , bu cevapların bazılarının artık geçerli olmayacağı şekilde sürümler üzerinde gelişmiştir. İtibariyle 4.1.x Gelincik serbest bırakılması üzerine sıralama azalan bir datealanda aşağıdaki yollardan birini yapılabilir:

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) { ... });

Artan bir sıralamada için, ihmal -dize sürümü veya kullanım değerlerine öneki 1, ascya ascending.


1
Yapabileceğiniz tonlarca farklı yolu göstermek için +1. Ancak, Sorgu # bulmanın bu kadar çok argümanı alacağını dokümanlarda bulamıyorum . İmza Query#find([criteria], [callback]). Belki "ölçütler" en fazla üç argüman olabileceğini söyleyen bazı gizli el sıkışma olduğunu düşündüm, ancak türü "Nesne" olarak listeliyor.
Nateowami

@Nateowami findDokümanlardaki yanlış yönteme bakıyorsunuz . Bkz Model.find.
JohnnyHK

1
Haklısın. Module#propertyGösterimi kullandıklarını gördüm ve aradılar #find. Belgelerde gezinmenin veya arama yapmanın kolay bir yolu yok gibi görünüyor. Bulmak için arama 187 sonuç verir.
Nateowami

2
Ayrıca _idalana göre de sıralayabilirsiniz . Örneğin, en son kaydı almak için şunları yapabilirsiniz:await db.collection.findOne().sort({ _id: -1 });
Mike K


12

Bugün Mongoose 3.5 (.2) kullanarak bu konuyla uğraşıyorum ve cevapların hiçbiri bu sorunu çözmeme yardımcı olmadı. Aşağıdaki kod snippet'i hile yapar

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

İhtiyacınız olan herhangi bir standart parametreyi find()(örneğin, yan tümceler ve dönüş alanları) gönderebilirsiniz, ancak geri arama yapılmaz . Geri arama olmadığında, zincirlediğiniz bir Sorgu nesnesi döndürür sort(). find()Tekrar aramaya (sonuç parametresi olsun veya olmasın - verimlilik nedeniyle herhangi bir şeye ihtiyaç duymamalısınız) tekrar aramanız gerekir.


4

Bunu yapıyorum:

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

Bu önce en son şeyleri gösterecektir.


1
$orderbyMongoDB 3.2'de kullanımdan kaldırılmıştır, bu yüzden artık kullanılmamalıdır.
JohnnyHK

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

De çalışmalı

DÜZENLE:

Hatayı alırsanız bunu kullanmayı da deneyebilirsiniz sort() only takes 1 Argument:

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

1
bu bana hata veriyor:Error: sort() only takes 1 Argument
mrid

@LukeXF güncellenmiş cevaba bakınız. umarım sana yardımcı olur :)
mrid

mrid şöyle olmalı: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi

2

Kısa çözüm:

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

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

1

Bu 1. yöntem işe yaramıyor. Sadece askıda ... Bence mongoose bir güncelleme nedeniyle .... Ve 2. yöntem sadece bildiğim mongo dokümanlar olduğunu.
TIMEX

Find () işlevi Mongoose değil, MongoDB işlevidir. Daha fazla bilgi için lütfen Mongoose API sayfasını okuyun MongoDB dokümanlarında Mongoose ile tanımlanan sözdizimini kullanabilirsiniz. Bu yüzden Mongoose'un kendi sıralama veya kesişen sorguları yoktur.
neebz

0

Ayrıca _idalana göre de sıralayabilirsiniz . Örneğin, en son kaydı almak için şunları yapabilirsiniz:

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

Ben de çok daha hızlı, çünkü alanınızın dateendekslenmediğine bahse girmeye hazırım .


0

Bu benim için çalışıyor.

`Post.find().sort({postedon: -1}).find(function (err, sortedposts){
    if (err) 
        return res.status(500).send({ message: "No Posts." });
    res.status(200).send({sortedposts : sortedposts});
 });`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.