Du har inte lagt upp din ursprungliga dokumentstruktur.
Document Structure:
{
"_id" : ObjectId("50b59cd75bed76f46522c471"),
"comment_id" : 61,
"post_id" : 29,
"comments" : [
{
"type" : "accepted",
"like" : 3
},
{
"type" : "rejected",
"like" : 3
},
{
"type" : "spam",
"like" : 3
}
]
}
Förutsatt att din dokumentstruktur enligt ovan har jag sammanställt den här frågan. Du måste manipulera det enligt dina behov.
db.posts.aggregate([
{$unwind:"$comments"},
{$match:{"$comments.type":{$ne:"spam"}}},
{$group:{_id:{post_id:"$post_id",comment_id:"$comment_id"},LikeSum:{$sum:"$comments.like"}}},
{$group:{_id:{post_id:"$_id.post_id"},AvgComments:{$avg:"$LikeSum"}}},
{$sort:{AvgComments:-1}},
{$limit:1}
])
Ovanstående fråga är konstruerad enligt följande:
1.) Unwind the comments array and form individual documents for each element in the comments array
2.) Select only the non-spam comments
3.) Calculate the sum of likes for each comment of all posts
4.) Calculate the average Comment likes for each post
5.) Sort documents in descending order of Average Comment Likes
6.) Select only the first document.
Utdatadokumentet kommer att vara ungefär som
{
"result" : [
{
"_id" : {
"post_id" : xx
},
"AvgComments" : xx.xx // Avg Comment likes for post xx
}
],
"ok" : 1
}