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.

Agréguese en dos colecciones y obtenga el valor más alto.

Me gustaría tener el número de visualizaciones de un artículo que ha sido visto más veces. A continuación, se muestra un pequeño ejemplo.

Usuarios:

{
username: “John”
},
{
username: “Doe”
}

Mensajes:

{
title: “Lorem Ipsum!”,
views: 400,
author: “John”
},
{
title: “Lorem Ipsum!”,
views: 200,
author: “John”
},
{
title: “Lorem Ipsum!”,
views: 100,
author: “John”
},
{
title: “Lorem Ipsum!”,
views: 403,
author: “Doe”
},
{
title: “Lorem Ipsum!”,
views: 299,
author: “Doe”
}

Quiero tener una propiedad para cada usuario en el objeto que contenga el número más alto de visualizaciones de un mensaje. De esta manera:

{
username: “John”
highest_view: 400
},
{
username: “Doe”
highest_view: 403
}

Podría resolver esto en el código recorriendo y consultando cada objeto, pero eso no parece ser la forma más conveniente.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr esto utilizando la tubería de agregación de MongoDB, podemos seguir los siguientes pasos:

    1. Agrupar los mensajes por autor y encontrar el número máximo de vistas utilizando el acumulador $max.
    {
       $group: {
          _id: "$author",
          highest_view: { $max: "$views" }
       }
    }
    
    1. Unir los datos agrupados con la colección de usuarios utilizando el operador $lookup.
    {
       $lookup: {
          from: "users",
          localField: "_id",
          foreignField: "username",
          as: "user"
       }
    }
    
    1. Proyectar y remodelar la salida para incluir solo los campos de nombre de usuario y highest_view.
    {
       $project: {
          username: { $arrayElemAt: [ "$user.username", 0 ] },
          highest_view: 1,
          _id: 0
       }
    }
    

    Poniéndolo todo junto, la tubería de agregación sería:

    db.messages.aggregate([
       {
          $group: {
             _id: "$author",
             highest_view: { $max: "$views" }
          }
       },
       {
          $lookup: {
             from: "users",
             localField: "_id",
             foreignField: "username",
             as: "user"
          }
       },
       {
          $project: {
             username: { $arrayElemAt: [ "$user.username", 0 ] },
             highest_view: 1,
             _id: 0
          }
       }
    ])
    

    Esto nos dará la salida deseada, que contiene el nombre de usuario y la vista más alta para cada usuario.

Comments are closed.