MongoDB'de bir koleksiyonu tarihe göre nasıl sıralayabilirim?


125

MongoDB'yi Node.JS ile kullanıyorum. Tarih ve diğer satırları içeren bir koleksiyonum var. Tarih bir JavaScript Datenesnesidir.

Bu koleksiyonu tarihe göre nasıl sıralayabilirim?


1
basit, koleksiyon.find (). sort ({tarih alanı: 1}, işlev (hata, imleç) {...}); ya da collection.find (). sort ({tarih alanı: -1}, işlev (hata, imleç) {...});
Atul Jain

Bir datesütuna ihtiyacınız olmayabileceğini unutmayın : stackoverflow.com/questions/5125521/…
phil294

Yanıtlar:


187

@JohnnyHK cevabında küçük bir değişiklik

collection.find().sort({datefield: -1}, function(err, cursor){...});

Çoğu kullanım durumunda, en son kayıtların iade edilmesini isteriz (en son güncellemeler / ekler için olduğu gibi).


1
İşleve ne koymayı düşünüyorsunuz? 2.6.3'te Datebir işlev olmadan nesneler üzerinde sıralama yapmaya çalışmak benim için çalışmıyor.
Sam Brightman

@SamBrightman Bu işlev yalnızca bir geri aramadır. Sorgu sonucuyla ne yapmak isterseniz isteyin, bu mantığı geri aramanın içine koyarsınız. Geri aramaların ne olduğu ve olay tabanlı programlamayı öğrenmek için nasıl çalıştıkları hakkında daha fazla bilgi edinebilirsiniz.
Sushant Gupta

Elbette, geri aramanın ne olduğunu biliyorum. Sadece sorudaki sıralama gerekliliğini gördüm ve tüm cevaplar geri arama veriyor. Aynı zamanda, sıralama benim için işe yaramadı, bu yüzden işlevde ek işler yapmanız gerektiğini düşündüm.
Sam Brightman

1
@SamBrightman Oh tamam. Kolaylık sağlamak için açık ve zincir gibi olabilirsinizcollection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta

5
sort () yazıyor sadece 1 Argüman alıyor
Jitendra Pancholi

39

Tarihe göre sıralama özel bir şey gerektirmez. Koleksiyonun istediğiniz tarih alanına göre sıralayın.

1.4.28 node.js yerel sürücüsü için güncellendi datefield, aşağıdaki yöntemlerden herhangi birini kullanarak artan şekilde sıralayabilirsiniz :

collection.find().sort({datefield: 1}).toArray(function(err, docs) {...});
collection.find().sort('datefield', 1).toArray(function(err, docs) {...});
collection.find().sort([['datefield', 1]]).toArray(function(err, docs) {...});
collection.find({}, {sort: {datefield: 1}}).toArray(function(err, docs) {...});
collection.find({}, {sort: [['datefield', 1]]}).toArray(function(err, docs) {...});

'asc'veya 'ascending'yerine de kullanılabilir 1.

Sıralama azalan kullanım için 'desc', 'descending'ya -1yerine 1.


Kullanıcı adı alanına yukarıdaki çözümü uyguluyorum, iyi çalışıyor ama büyük / küçük harfe duyarlı Nasıl görmezden gelinir?
Rahul Mat

Çok yönlü (y) doğru cevap
abdulbarik

30
db.getCollection('').find({}).sort({_id:-1}) 

Bu, koleksiyonunuzu ekleme tarihine göre azalan sırada sıralayacaktır.


16

Sushant Gupta'nın cevapları biraz modası geçmiş ve artık işe yaramıyor.

Aşağıdaki kod parçası şimdi böyle olmalıdır:

collection.find({}, {"sort" : ['datefield', 'asc']} ).toArray(function(err,docs) {});


@JohnnyHK Tatlı. Senaryoyu tam olarak hatırlamıyorum, ama geçen yaz sıralamanın Sushant'ın pasajıyla çalışmasını sağlamaya çalışıyordum ve bu benim için işe yaramadı. Belki de toArrayparça eksik olduğu içindir .
krikara

Bu aslında yanlış bir cevap, node.js'de yanlış sonuç veriyor
David A

12

Bu benim için çalıştı:

collection.find({}, {"sort" : [['datefield', 'asc']]}, function (err, docs) { ... });

Node.js, Express.js ve Monk'u kullanma



5

Firavun faresi ile bu kadar basit:

collection.find().sort('-date').exec(function(err, collectionItems) {
  // here's your code
})

4

Sıralamanın çalışması için Ek Kare [] Köşeli Ayraç gereklidir.

collection.find({}, {"sort" : [['datefield', 'asc']]} ).toArray(function(err,docs) {});

2

tarih formatınız şöyle ise: 14/02/1989 ----> bazı sorunlar bulabilirsiniz

ISOdate'i şu şekilde kullanmanız gerekir:

var start_date = new Date(2012, 07, x, x, x); 

-----> sonuç ------> ISODate ("2012-07-14T08: 14: 00.201Z")

şimdi sadece sorguyu şu şekilde kullanın:

 collection.find( { query : query ,$orderby :{start_date : -1}} ,function (err, cursor) {...}

bu kadar :)


2

Mongoose ile 'toArray'i kullanamadım ve şu hatayı TypeError: Collection.find(...).sort(...).toArray is not a function. alıyordum : toArray işlevi, Native MongoDB NodeJS sürücüsünden ( başvuru ) Cursor sınıfında var .

Ayrıca sort yalnızca bir parametreyi kabul eder, bu nedenle işlevinizi onun içinde geçiremezsiniz.

Bu benim için çalıştı ( Emil tarafından yanıtlandığı gibi ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
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.