Estaba tratando de encontrar cómo puedo ordenar la fecha de cumpleaños por día y mes con un .find() realizado por mongoose.
Código real:
const embed2 = new MessageEmbed() .setColor('#FBC78E') .setTitle(`Liste des anniversaires de ${message.guild.name}`) birthday.find({}).then(data => { embed2 .setDescription(Array.from(data).map(u => `<@${u.user_id}> : ${u.birthday}`)) loading_message.delete(); message.guild.channels.resolve(args[1]).send(embed2) });
El problema es que cuando trato de agregar un .sort('cumpleaños') a mi .find(), solo filtra los días, pero no es lo que estoy buscando, aquí está el resultado de .find() (sin el .sort()):
[ { _id: new ObjectId("620d763c86159915746f431b"), user_id: '493470054415859713', birthday: '04/11', __v: 0 }, { _id: new ObjectId("620d770505fa9fe0910968c0"), user_id: '933751655046979645', birthday: '18/05', __v: 0 }, { _id: new ObjectId("620d77575417ab94a5f2c837"), user_id: '735987183714041867', birthday: '15/12', __v: 0 }, { _id: new ObjectId("620d85fed17e202ed6d2b847"), user_id: '320851795058360331', birthday: '03/11', __v: 0 } ]
Resultado exceptuado:
[ { _id: new ObjectId("620d770505fa9fe0910968c0"), user_id: '933751655046979645', birthday: '18/05', __v: 0 }, { _id: new ObjectId("620d85fed17e202ed6d2b847"), user_id: '320851795058360331', birthday: '03/11', __v: 0 }, { _id: new ObjectId("620d763c86159915746f431b"), user_id: '493470054415859713', birthday: '04/11', __v: 0 }, { _id: new ObjectId("620d77575417ab94a5f2c837"), user_id: '735987183714041867', birthday: '15/12', __v: 0 } ]
Como puede ver aquí, los cumpleaños están ordenados por día Y mes, que es lo que intento hacer. Gracias.
Cuando ordena los valores de campo "04/11", "18/05", "15/12", "03/11" - la ordenación ocurre como "03/11", "04/11", "15/12 ", "18/05". Es por los valores de cadena, donde "0" es menor que "1" y así sucesivamente. Dado que los datos de birthday
tienen el formato "DD/MM", no puede obtener la clasificación correcta que busca, es decir, por MM y DD. El formato de datos debe ser "MM/DD". La forma de hacerlo es transformar el formato y luego ordenar con los valores recién formateados.
Por ejemplo, puede usar operadores de agregación para cambiar los valores de DD y MM en el campo de birthday
y crear un nuevo campo llamado birthday_MM_DD
y usarlo para ordenar. Tenga en cuenta que el código se ejecuta en mongosh
o mongo
shell.
var pipeline = [ // Create a new birthday field with MM/DD format (a temporary field) { $addFields: { birthday_MM_DD: { $concat: [ { $substrCP: [ "$birthday", 3, 2 ] }, "/", { $substrCP: [ "$birthday", 0, 2 ] } ] } } }, // Sort with the newly formatted birthday field { $sort: { birthday_MM_DD: 1 } }, // Remove the temporary birthday field // (as it is no longer needed) { $unset: "birthday_MM_DD" }, ] db.collection.aggregate(pipeline)
El resultado tiene los documentos. formateado ordenado correctamente por birthday
de nacimiento, como se esperaba: "18/05", "03/11", "04/11", "15/12"