MongoDB使用一个查询检索每个元素之一

时间:2014-06-12 06:54:00

标签: mongodb pymongo nosql

收集包含属于特定群体的多个元素的集合 - 例如,让我们说它看起来像这样:

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")

分组为数组或字典

1 个答案:

答案 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运算符的文档。