【问题标题】:MongoDB retrieving one of each element with one queryMongoDB 使用一个查询检索每个元素之一
【发布时间】:2014-08-02 09:52:01
【问题描述】:

收集一个包含许多属于特定组的元素的集合 - 举个例子,假设它看起来像这样:

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'} 的最新文章,这样查询的返回将是最新发表的文章(一篇)'New York时报、《黑客新闻》等最新发表的文章(一篇)。

这可以在单个查询中完成,还是必须是多个查询,如果是后者,我是否首先必须构建一个唯一“来源”列表,然后从每个查询中查询一篇文章?

跟进:如何获得子分组,即假设数据库条目也有作者:

{'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 } 

目标是为每个“作者”返回一个条目(如前所述,但也按“源”分组为数组或字典)

【问题讨论】:

标签: mongodb pymongo nosql


【解决方案1】:

你可以使用聚合框架来得到你想要的:

db.news.aggregate([
    { $sort: { "data_published": -1 } },
    {
        $group: {
            _id: "$source",
            name: {
                $first: "$article_name"
            },
            link: {
                $first: "$link"
            }
        }
    }
]);

编辑 如果要按多个字段分组,则需要将$group 中的_id 参数更改为:

_id : { source : "$source", author : "$author" }

这将首先按data_published 字段对您的文档进行排序,然后按source 分组。 $first 运算符只会采用它遇到的值。

有关更多详细信息,您可以查看$group 运算符的文档。

【讨论】:

  • 与其他替代方案相比,它的效率如何?即在一个来源中有一系列文章,即“来源”:“黑客新闻”,“文章”:[x1,x2,x3]或单独的集合?
  • @user3467349 我认为这种结构是你能得到的最有效的。每个文档的大小限制为 16MB,因此将所有文章存储在一个文档中可能是不可能的。将它们分成 N 个单独的集合意味着您必须执行 N 次查询才能获得结果
  • 如何在结果中获得子分组?我编辑了我的问题 -
猜你喜欢
  • 2014-08-16
  • 1970-01-01
  • 2016-06-29
  • 2016-12-31
  • 2015-04-25
  • 2018-08-30
  • 2015-07-21
  • 2017-02-28
相关资源
最近更新 更多