初期伝票構造を転記していません。
Document Structure:
{
"_id" : ObjectId("50b59cd75bed76f46522c471"),
"comment_id" : 61,
"post_id" : 29,
"comments" : [
{
"type" : "accepted",
"like" : 3
},
{
"type" : "rejected",
"like" : 3
},
{
"type" : "spam",
"like" : 3
}
]
}
上記のようなドキュメント構造を想定して、このクエリを作成しました。必要に応じて操作する必要があります。
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}
])
上記のクエリは次のように構成されています。
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.
出力ドキュメントは次のようになります
{
"result" : [
{
"_id" : {
"post_id" : xx
},
"AvgComments" : xx.xx // Avg Comment likes for post xx
}
],
"ok" : 1
}