【问题标题】:Is it possible to aggregate $$ROOT in mongo db?是否可以在 mongodb 中聚合 $$ROOT?
【发布时间】:2021-02-23 15:36:17
【问题描述】:

我有关注 Mongo 收藏。

[
  {
    "query": "a",
    "page": "p1",
    "clicks": 10,
    "date": "x"
  },
  {
    "query": "b",
    "page": "p1",
    "clicks": 5,
    "date": "x"
  },
  {
    "query": "a",
    "page": "p1",
    "clicks": 5,
    "date": "y"
  },
  {
    "query": "c",
    "page": "p2",
    "clicks": 2,
    "date": "y"
  },
  
]

输出应该是这样的:

 [
      {
        "page" : "p1",
        "most_clicks_query" : "a",
        "sum_of_clicks_for_query" : 15

      },
{
        "page" : "p2",
        "most_clicks_query" : "c",
        "sum_of_clicks_for_query" : 2

      },
  
      
    ]

获取此输出的逻辑

我需要每个页面点击次数最多的查询名称(对于该查询)

我要问什么

  • 我希望在一个聚合查询中得到这个结果。
  • 所以我在玩 $$ROOT。
  • 在这条路径中,现在我不得不对 $$ROOT 进行分组(以获取查询的点击总和)。
  • 有人可以指导我更好地执行此操作吗?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    这是您要查找的聚合:

    db.collection.aggregate([
      {
        "$group": {
          "_id": {
            "page": "$page",
            "query": "$query"
          },
          "sum_of_clicks_for_query": {
            "$sum": "$clicks"
          }
        }
      },
      {
        "$project": {
          "_id": false,
          "page": "$_id.page",
          "most_clicks_query": "$_id.query",
          "sum_of_clicks_for_query": true
        }
      },
      {
        $sort: {
          "sum_of_clicks_for_query": -1
        }
      },
      {
        $group: {
          _id: "$page",
          group: {
            $first: "$$ROOT"
          }
        }
      },
      {
        $replaceRoot: {
          newRoot: "$group"
        }
      }
    ])
    

    游乐场:https://mongoplayground.net/p/Uzk3CuSwVRM

    【讨论】:

    • 对于 "p1" ,必须只有一个文档。但您的查询为“p1”返回 2 个文档。无论如何,我很感激你的回答。
    • @PrageethPeiris 您显然是按页面和查询分组。它为 p1 返回 2 个文档的原因是因为 p1 有 2 个不同的查询:ab。在您想要的结果中,您将显示p1"most_clicks_query" : "a"。那么p1"most_clicks_query" : "b" 去哪儿了?
    • 我想消除查询 'b' 。因为查询 'a' 是唯一一个对 'p1' 的点击次数最多的查询。示例:“p1”的总点击次数为 20。查询“a”贡献了 15 次点击,查询“b”贡献了 5 次点击。
    • @PrageethPeiris 没问题。更新了答案以及 Playground 链接。
    • 完美。我写的原始查询只需要修改即可找到每个page 的最大值sum_of_clicks_for_query
    猜你喜欢
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2017-01-06
    • 1970-01-01
    • 2021-03-20
    • 2012-09-01
    相关资源
    最近更新 更多