收集包含属于特定群体的多个元素的集合 - 例如,让我们说它看起来像这样:
collection = db['news']
{'source': 'New York Times', 'article_name': xxx, 'data_published': xxx, 'link': xxx,'index': xxx, 'first_paragraph': xxx }
{'source': 'Hacker News', 'article_name': xxx, 'data_published': xxx, 'link': xxx,'index': xxx, 'first_paragraph': xxx }
假设我想要检索集合中每个不同 {' source'}的最新文章,以便返回查询将是最新发布的文章(一,“纽约时报”,最新发表的一篇文章(一篇)为黑客新闻'等。
这可以在一个查询中完成,还是必须是多个查询,如果后者是这样的话,我首先要建立一个独特的来源列表'而不是从每个查询一篇文章?
跟进:如何获得子分组,即假设数据库条目也有作者:
{'source': 'New York Times', 'author': xxx, 'article_name': xxx, 'data_published': xxx, 'link': xxx,'index': xxx, 'first_paragraph': xxx }
{'source': 'Hacker News', author': xxx, 'article_name': xxx, 'data_published': xxx, 'link': xxx,'index': xxx, 'first_paragraph': xxx }
目标是每个"作者"返回一个条目。 (如前所述,但也按" source")
分组为数组或字典答案 0 :(得分:1)
您可以使用聚合框架来获得所需内容:
db.news.aggregate([
{ $sort: { "data_published": -1 } },
{
$group: {
_id: "$source",
name: {
$first: "$article_name"
},
link: {
$first: "$link"
}
}
}
]);
修改强>
如果您想按多个字段进行分组,则需要将_id
中的$group
参数更改为:
_id : { source : "$source", author : "$author" }
这将首先按data_published
字段对文档进行排序,然后按source
进行分组。 $first
运算符只会获取它遇到的值。
有关详细信息,请查看$group运算符的文档。