【问题标题】:MongoDB nested Aggregate GroupingMongoDB 嵌套聚合分组
【发布时间】:2021-03-19 15:26:13
【问题描述】:

样本数据:

[
    {type: 'partial', jobId: '121', browser: 'chrome', status:'true', jobName:'one'},
    {type: 'partial', jobId: '122', browser: 'chrome', status:'false', jobName:'two'},
    {type: 'partial', jobId: '121', browser: 'firefox', status:'false', jobName:'one'},
    {type: 'partial', jobId: '122', browser: 'firefox', status:'true', jobName:'two'},
    {type: 'full', jobId: '123', browser: 'chrome', status:'true', jobName:'three'},
    {type: 'full', jobId: '123', browser: 'chrome', status:'true', jobName:'three'},
    {type: 'full', jobId: '123', browser: 'chrome', status:'false', jobName:'three'},
    {type: 'full', jobId: '124', browser: 'firefox', status:'false', jobName:'four'},
]

需要输出:

[
  {
    "type": "partial",
    "browsers": [
      {
        "browser": "chrome",
        "jobIds": [
          {
            "jobId": "121",
            "results": [
              {
                "jobName": "one",
                "status": "true",
              },
            ]
          },
          {
            "jobId": "122",
            "results": [
              {
                "jobName": "two",
                "status": "false"
              },
            ]
          }
        ]
      },
      {
        "browser": "firefox",
        "testIds": [
          {
            "jobId": "121",
            "results": [
              {
                "jobName": "one",
                "status": "false"
              },
            ]
          },
          {
            "jobId": "122",
            "results": [
              {
                "jobName": "two",
                "status": "true"
              },
            ]
          }
        ]
      }
    ]
  },
  {
    "type": "full",
    "browsers": [
      {
        "browser": "chrome",
        "jobIds": [
          {
            "jobId": "123",
            "results": [
              {
                "jobName": "three",
                "status": "true"
              },
              {
                "jobName": "three",
                "status": "true"
              },
              {
                "jobName": "three",
                "status": "false"
              }
            ]
          },
        ]
      },
      {
        "browser": "firefox",
        "testIds": [
          {
            "jobId": "124",
            "results": [
              {
                "jobName": "four",
                "status": "false"
              },
            ]
          },
        ]
      }
    ]
  }
]

我了解如何使用组,但我不了解如何进行嵌套分组。我尝试了以下查询,它没有获取所需的结果,我不知道如何继续。

   db.collection.aggregate([
  {
    $match: {
      jobId: {
        "$exists": true
      }
    }
  },
  {
    $sort: {
      _id: -1
    }
  },
  {
    $group: {
      _id: {
        type: "$type",
        browser: "$browser",
        jobId: "$jobId"
      },
      results: {
        $push: {
          jobName: "$jobName",
          status: "$status",
          type: "$type",
          jobId: "$jobId"
        }
      }
    }
  },
  {
    $addFields: {
      results: {
        $slice: [
          "$results",
          30
        ]
      }
    }
  },
  {
    $group: {
      _id: "$_id.browser",
      results: {
        $push: {
          results: "$results"
        }
      }
    }
  },
  
])

需要获取最近的 30 个结果,这就是我在查询中添加 $addFields 的原因。

https://mongoplayground.net/p/pt3H1O445GA

【问题讨论】:

  • 您能描述一下您的预期结果和您的要求吗?
  • 它似乎是部分与全部,然后是每个浏览器上的浏览器,按浏览器和任务@turivishal 分组
  • 部分 vs 完整,然后是浏览器,然后按 jobIds 分组
  • 您只有2个浏览器,还是需要通用解决方案? @硬代码
  • 需要一个通用的解决方案,不是特别是两个浏览器,jobId也没有什么特别的

标签: mongodb mongodb-query mongoose-schema


【解决方案1】:
  • $group by typebrowserjobId 并制作 results 数组
  • $group by typebrowser 并制作 jobs 数组
  • $group by type 并制作 browsers 数组
db.collection.aggregate([
  { $match: { jobId: { $exists: true } } },
  { $sort: { _id: -1 } },
  {
    $group: {
      _id: {
        type: "$type",
        browser: "$browser",
        jobId: "$jobId"
      },
      results: {
        $push: {
          jobName: "$jobName",
          status: "$status"
        }
      }
    }
  },
  { $addFields: { results: { $slice: ["$results", 30] } } },
  {
    $group: {
      _id: {
        type: "$_id.type",
        browser: "$_id.browser"
      },
      browser: { $first: "$_id.browser" },
      jobIds: {
        $push: {
          jobId: "$_id.jobId",
          results: "$results"
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id.type",
      type: { $first: "$_id.type" },
      browsers: {
        $push: {
          browser: "$_id.browser",
          jobIds: "$jobIds"
        }
      }
    }
  },
  { $project: { _id: 0 } }
])

Playground

【讨论】:

  • 在“jobIds”组中是否可以按“jobName”排序?
  • 在第二阶段对jobName进行排序,如{ $sort: { _id: -1, jobName: 1 } },
  • 我在第二阶段后添加了 $sort,但它不起作用mongoplayground.net/p/ipQ_zXsmudL
  • 再次检查你的playgorund,因为你在最后一个第二阶段添加了$sort阶段,你需要添加表单第一第二阶段看playground
猜你喜欢
  • 1970-01-01
  • 2021-04-19
  • 2017-07-16
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2021-03-13
相关资源
最近更新 更多