Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

494
Vistas
Cómo filtrar documentos en el modelo Mongoose con datos de otros modelos

Por ejemplo, tengo 3 modelos:

Cuentos:

 { title: { type: String }, text: { type: String } }

Comentarios:

 { text: { type: String }, story: { type: mongoose.Schema.Types.ObjectId, ref: "Stories" } }

Gustos:

 { story: { type: mongoose.Schema.Types.ObjectId, ref: "Stories" } }

¿Cómo puedo obtener las historias más populares, si la popularidad está determinada por la cantidad de comentarios y me gusta? La historia es más popular si tiene más comentarios y me gusta, por ejemplo.

Gracias.

Upd: datos de ejemplo.

 Stories: { "title": "First story", "text": "This must be the MOST popular story..." } { "title": "Second story", "text": "This story is popular too, but not as the first story." } { "title": "Third story", "text": "This is a unpopular story, because dont have any comment or like" } Comments: { "title": "Foo", "story": ObjectId("First Story ID") } { "title": "Foobar", "story": ObjectId("First Story ID") } { "title": "Bar", "story": ObjectId("Second Story ID") } Likes: { "story": ObjectId("First Story ID") } { "story": ObjectId("First Story ID") } { "story": ObjectId("First Story ID") } { "story": ObjectId("First Story ID") } { "story": ObjectId("Second Story ID") } { "story": ObjectId("Second Story ID") } { "story": ObjectId("Third Story ID") }

El resultado del filtrado debería ser así:

  1. Primera historia (4 me gusta, 2 comentarios)
  2. Segunda historia (2 me gusta, 1 comentario)
  3. Tercera historia (1 me gusta)
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Si desea ordenar los datos de acuerdo con la popularidad , donde la popularidad se define por (me gusta total + comentarios totales) , puede usar esta consulta aggregate con $lookup .

 db.getCollection('stories').aggregate([ {$lookup:{from:"comments",localField:"_id", foreignField:"story", as:"comments"}}, {$lookup:{from:"likes",localField:"_id", foreignField:"story", as:"likes"}}, { $project: { title: 1, text: 1,comments:1,likes:1, count: { $add: [ {$size: "$comments"}, {$size: "$likes"} ] } } }, {$sort:{"count":-1}} ])

para mangosta:

 StoryModelName.aggregate([ {$lookup:{from:"comments",localField:"_id", foreignField:"story", as:"comments"}}, {$lookup:{from:"likes",localField:"_id", foreignField:"story", as:"likes"}}, { $project: { title: 1, text: 1,comments:1,likes:1, count: { $add: [ {$size: "$comments"}, {$size: "$likes"} ] } } }, {$sort:{"count":-1}} ]).exec(function(err, values) { if(err) { // return error } // return values })

O si desea ordenar por me gusta, luego comentarios o comentarios y luego me gusta .

puede usar esta consulta:

 StoryModelName.aggregate([ {$lookup:{from:"comments",localField:"_id", foreignField:"story", as:"comments"}}, {$lookup:{from:"likes",localField:"_id", foreignField:"story", as:"likes"}}, {$group:{_id:"$_id", totalLikes: {$sum:{$size: "$likes"}}, totalComments:{$sum:{$size: "$comments"}}, likes:{$first:"$likes"}, comments:{$first:"$comments"} } }, {$sort:{totalLikes:-1,totalComments:-1}} // can be comments ten like as you need ]).exec(function(err, values) { if(err) { // return error } // return values })
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda