我有一个包含分类和时间戳的博客文章列表。现在,如果我想按时间顺序排列它们,但限制每个分类的出现次数,比如说,* 每个分类只有3篇文章 *,常规的$group似乎不是正确的方法。topN也是如此,因为它按分类对这些文章进行了分组,但我失去了时间顺序列表。
ovfsdjhp1#
您仍然可以将"$group"与"$topN"一起使用,然后,例如,接着使用另一个"$group"、排序、"$unwind"和"$replaceWith"。注意:这将给予最早的帖子。如果你想要最新的帖子,你可以调整排序顺序。
"$group"
"$topN"
"$unwind"
"$replaceWith"
db.blogPosts.aggregate([ { // get max 3 items from category // sorted by timestamp "$group": { "_id": "$category", "postsTop3": { "$topN": { "n": 3, "sortBy": {"timestamp": 1}, "output": "$$ROOT" } } } }, { // aggregate all top3's "$group": { "_id": null, "posts": {"$push": "$postsTop3"} } }, { // sort them all by timestamp "$set": { "posts": { "$sortArray": { "input": { "$reduce": { "input": "$posts", "initialValue": [], "in": { "$concatArrays": ["$$value", "$$this"] } } }, "sortBy": {"timestamp": 1} } } } }, {"$unwind": "$posts"}, {"$replaceWith": "$posts"} ])
试试看mongoplayground.net。
1条答案
按热度按时间ovfsdjhp1#
您仍然可以将
"$group"
与"$topN"
一起使用,然后,例如,接着使用另一个"$group"
、排序、"$unwind"
和"$replaceWith"
。注意:这将给予最早的帖子。如果你想要最新的帖子,你可以调整排序顺序。
试试看mongoplayground.net。