Comment puis-je trier le document en ordre croissant ou décroissant dans MongoDB
const mongoose = require('mongoose'); const atHomeSchema = new mongoose.Schema({ name: { type: String, required: true }, partnerName: { type: String, required: true }, email: { type: String, required: true }, phone: { type: String, required: true }, weddingDate: { type: Date, required: false }, city: { type: String, required: true }, guest: { type: Number, required: true }, desc: { type: String, required: true }, createdAt:{ type: Date, default: Date.now() } }); module.exports = mongoose.model('AtHome', atHomeSchema);
4 Réponses :
Vous devez inclure le champ chacun La scène transforme les documents lorsqu'ils passent à travers le pipeline. Dans votre première étape, vous avez filtré CaredateAt CODE> dans la projection ou modifier l'ordre des étapes de la pipeline
$ Trier code> alors
$ projet code>.
crééa code> de sorte que la deuxième étape ne prend aucun effet. Il est recommandé d'utiliser
$ trier code> avant
$ Project code> Stage afin
$ trier code> étape peut utiliser l'index. Cela fournira une meilleure performance < / a>. p>
selon le cadre d'agrégation , vous devez d'abord trier le données, puis projetez-le à la sortie souhaitée. Essayez la requête suivante:
const contact = await AtHome.aggregate([ { $sort : { createdAt : -1 } }, { $project: { name:1, partnerName:1, phone:1, email:1, city:1, guest:1, desc:1, requestedOn: { $dateToString: { format: "%d-%m-%Y", date: "$createdAt" } }, weddingDate: { $dateToString: { format: "%d-%m-%Y", date: "$weddingDate" } }, } } ]); try { res.send(contact); } catch (err) { res.send('INVALID'); }
Comme mentionné dans les réponses ci-dessus, vous devez trier les données avant projet. Je peux voir l'en vous schéma code> que vous utilisez
défaut: date.now () code> pour le
créateat code>, cela définira la valeur de < Code> CrééAt CODE> à TIME Lorsque
SCHEMA CODE> est défini, tous les enregistrements auront la même valeur pour
créateda code> jusqu'à ce que le redémarrage du serveur est suivant. Vous pouvez utiliser
date.now code> à la place, si vous devez définir le
créateda code> à l'heure lorsque l'enregistrement est créé
Je pense que votre première étape devrait être de comprendre comment fonctionne le pipeline d'agrégation. Dans les phases de pipeline, les données vont d'une étape à une autre. Chaque étage nous faisons quelques modifications de données et que les données modifiées sont transmises à la prochaine étape du pipeline.
Votre première étape est un projet qui renvoie les champs que vous avez spécifiés: p>
et cette donnée est ensuite transmise à la phase de tri et, comme l'étape de tri ne peut pas trouver de champ CareatAt dans des données de première étape, des données non traitées sont renvoyées. . P>
Ajoutez p>
const schema = Schema({ //your fields }, { timestamps: true } });
S'il vous plaît, envoyez votre
ATHOME code> schéma.
Ajouter
créateda: 1 code> à
$ projet code> objet.
@MAHDIHASHEMI
const athomeschema = nouveau mongoose.schema ({nom: {Type: chaîne, obligatoire: true}, Nom Partnern: {Type: String, Obligatoire: true}, Email: {Type: String, Obligatoire: TRUE}, Téléphone: {Type: String, Obligatoire: TRUE}, MariageDate: {Type: Date, Obligatoire: False}, Ville: {Type: String, Obligatoire: TRUE}, Guest: {Type: Number, Obligatoire: True}, Desc: {Type: String, Obligatoire: True}, Careda: {Type: Date, Par défaut: date.now ()}}); code>
N'envoyez pas cela dans la section Commentaires, mettez à jour votre question.
@MAHDIHASHEMI Ajouter CAREDAT: 1 à $ objet de projet. n'a pas fonctionné
@MAHDIHASHEMI J'ai mis à jour ma quête, s'il vous plaît vérifier maintenant
Trier votre résultat avant le projet, cela peut fonctionner.