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í:
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 })