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?


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).


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.


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


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


@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



5

Avec la mangouste, c'est aussi simple que:

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

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

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 :)


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
})
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.