es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Proyecto y luego ordenar en mongoose para campos de arreglo.

Tengo un modelo mongoose para una publicación en un sitio web similar a una red social llamado PostModel:

{
caption: String,
likes: [] // array para almacenar información sobre los usuarios que les gustó el video, básicamente una referencia a un modelo diferente
comments: [] // array para almacenar objetos de comentario
}

Quiero ordenar todos los videos en una consulta de búsqueda basada en el número de “likes”, que en este caso sería la longitud del array “likes”. Si dos publicaciones tienen el mismo número de “likes”, quiero ordenar por el número de comentarios, o de lo contrario, la longitud del array “comments”.

El problema es que no está funcionando. Esto es lo que intenté:

PostModel.find({}, {
likes: { $size: “$likes” },
comments: { $size: “$comments” }
},
{
sort: { likes: -1, comments: -1 } // da un error “no se puede ordenar con claves que son matrices paralelas”
})

Esto me llevó a creer que la ordenación ocurre antes de la proyección. Para confirmarlo, probé la siguiente consulta:

PostModel.find({}, {
_l: { $size: “$likes” },
_c: { $size: “$comments” }
},
{
sort: { _l: -1, _c: -1 }
})

Esta consulta no dio ningún error, pero no ordenó el array resultante en absoluto. Entonces, se confirma que la proyección realmente ocurre después de la ordenación en mongoose.

¿Cómo debería ordenar el array resultante por número de “likes” y número de comentarios en este caso?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para ordenar el array resultante por número de “likes” y número de comentarios, puedes utilizar la tubería de agregación de MongoDB. Aquí tienes un ejemplo de consulta:

    PostModel.aggregate([
      {
        $project: {
          caption: 1,
          likes: { $size: "$likes" },
          comments: { $size: "$comments" }
        }
      },
      {
        $sort: { likes: -1, comments: -1 }
      }
    ]);
    

    En esta consulta, primero utilizamos la etapa $project de la tubería de agregación para incluir únicamente los campos caption, likes y comments, y para calcular el tamaño de los arrays likes y comments utilizando el operador $size. Luego, utilizamos la etapa $sort para ordenar los documentos por likes en orden descendente, y para los documentos que tienen el mismo número de likes, ordenamos por comments. De esta manera, logramos el orden de clasificación deseado.

Comments are closed.