Comment trier une collection par date dans MongoDB?

125

J'utilise MongoDB avec Node.JS. J'ai une collection qui contient une date et d'autres lignes. La date est un Dateobjet JavaScript .

Comment puis-je trier cette collection par date?

couler
la source
1
simple, collection.find (). sort ({champ date: 1}, fonction (err, curseur) {...}); ou vous pouvez aussi utiliser collection.find (). sort ({datefield: -1}, function (err, cursor) {...});
Atul Jain
Notez que vous n'aurez peut-être pas besoin d'une datecolonne: stackoverflow.com/questions/5125521/…
phil294

Réponses:

187

Juste une légère modification de la réponse @JohnnyHK

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

Dans de nombreux cas d'utilisation, nous souhaitons avoir les derniers enregistrements à renvoyer (comme pour les dernières mises à jour / insertions).

Sushant Gupta
la source
1
Que comptez-vous mettre dans la fonction? Essayer simplement de trier des Dateobjets sans fonction ne fonctionne pas pour moi sur 2.6.3.
Sam Brightman
@SamBrightman Cette fonction n'est qu'un rappel. Quoi que vous vouliez faire avec le résultat de la requête, vous mettez cette logique dans votre rappel. Vous pouvez en savoir plus sur ce que sont les rappels et comment ils fonctionnent pour apprendre la programmation basée sur les événements.
Sushant Gupta
Bien sûr, je sais ce qu'est un rappel. Je n'ai vu que l'exigence de tri dans la question et toutes les réponses donnent des rappels. En même temps, le tri ne fonctionnait pas pour moi, alors j'ai pensé que vous deviez peut-être faire un travail supplémentaire dans la fonction.
Sam Brightman
1
@SamBrightman Oh ok. Pour plus de commodité, vous pouvez être explicite et enchaîner commecollection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta
5
il dit que sort () ne prend qu'un argument
Jitendra Pancholi
39

Le tri par date ne nécessite rien de spécial. Triez simplement par le champ de date souhaité de la collection.

Mis à jour pour le pilote natif node.js 1.4.28, vous pouvez trier par ordre croissant en datefieldutilisant l'une des méthodes suivantes:

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'ou 'ascending'peut également être utilisé à la place de 1.

Pour trier décroissant, l' utilisation 'desc', 'descending'ou -1à la place du 1.

JohnnyHK
la source
J'applique la solution ci-dessus sur le champ du nom d'utilisateur, cela fonctionne bien mais c'est sensible à la casse Comment l'ignorer?
Rahul Matte
Bonne réponse avec plusieurs voies (y)
abdulbarik
30
db.getCollection('').find({}).sort({_id:-1}) 

Cela triera votre collection par ordre décroissant en fonction de la date d'insertion

Rich Rajah
la source
16

Les réponses de Sushant Gupta sont un peu dépassées et ne fonctionnent plus.

L'extrait suivant devrait ressembler à ceci maintenant:

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

krikara
la source
@JohnnyHK Sweet. Je ne me souviens pas du scénario exact, mais l'été dernier, j'essayais de faire fonctionner le genre avec l'extrait de Sushant et cela ne fonctionnait tout simplement pas pour moi. C'est peut-être parce qu'il lui manquait la toArraypièce.
krikara
C'est en fait une mauvaise réponse, cela donne un mauvais résultat dans node.js
David A
12

Cela a fonctionné pour moi:

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

Utilisation de Node.js, Express.js et Monk

Poisson RougeGrenade
la source
5

Avec la mangouste, c'est aussi simple que:

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

Un support carré [] supplémentaire est nécessaire pour que le paramètre de tri fonctionne.

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

si votre format de date est comme ceci: 14/02/1989 ----> vous pouvez rencontrer des problèmes

vous devez utiliser ISOdate comme ceci:

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

-----> le résultat ------> ISODate ("2012-07-14T08: 14: 00.201Z")

maintenant, utilisez simplement la requête comme ceci:

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

c'est tout :)

Amine_Dev
la source
2

Avec mongoose, je n'ai pas pu utiliser 'toArray' et j'ai obtenu l'erreur: TypeError: Collection.find(...).sort(...).toArray is not a function. La fonction toArray existe sur la classe Cursor du pilote Native MongoDB NodeJS ( référence ).

Sort n'accepte également qu'un seul paramètre, vous ne pouvez donc pas y passer votre fonction.

Cela a fonctionné pour moi (comme l'a répondu Emil ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
Pranche Tiwari
la source