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.