【问题标题】:Nested grouping with mongoose使用猫鼬进行嵌套分组
【发布时间】:2022-01-17 18:32:24
【问题描述】:

我正在尝试在 mongodb 中实现嵌套组查询,但我遇到了困难。如何在此处按日期和活动 ID 对数据进行分组?每个campaign_id 应包含一个嵌套的广告素材数组,其中包含每个广告素材的数据(查看次数和点击次数)。

数据如下所示: 数据:

[
  {
    "_id": ObjectId("61e3b88d3f14fb87161651c7"),
    "campaign_id": 41,
    "creative_id": 143,
    "date": ISODate("2022-01-16T00:00:00Z"),
    "views": 1
  },
  {
    "_id": ObjectId("61e3b8cd3f14fb87161651ef"),
    "campaign_id": 41,
    "creative_id": 143,
    "date": ISODate("2022-01-16T00:00:00Z"),
    "views": 7070,
    "clicks": 241
  },
  {
    "_id": ObjectId("61e3b8cd3f14fb87161651f2"),
    "campaign_id": 41,
    "creative_id": 144,
    "date": ISODate("2022-01-16T00:00:00Z"),
    "views": 3474,
    "clicks": 52
  },
  {
    "_id": ObjectId("61e3b8cd3f14fb87161651f4"),
    "campaign_id": 41,
    "creative_id": 146,
    "date": ISODate("2022-01-16T00:00:00Z"),
    "views": 3595,
    "clicks": 52
  },
  {
    "_id": ObjectId("61e3b8cd3f14fb87161651f6"),
    "campaign_id": 41,
    "creative_id": 145,
    "date": ISODate("2022-01-16T00:00:00Z"),
    "views": 3561,
    "clicks": 227
  },
  {
    "_id": ObjectId("61e4b18a3f14fb871616d8b0"),
    "campaign_id": 41,
    "creative_id": 143,
    "date": ISODate("2022-01-17T00:00:00Z"),
    "views": 9528,
    "clicks": 104
  },
  {
    "_id": ObjectId("61e4b18a3f14fb871616d8b2"),
    "campaign_id": 41,
    "creative_id": 145,
    "date": ISODate("2022-01-17T00:00:00Z"),
    "views": 4699,
    "clicks": 100
  },
  {
    "_id": ObjectId("61e4b18a3f14fb871616d8b5"),
    "campaign_id": 41,
    "creative_id": 146,
    "date": ISODate("2022-01-17T00:00:00Z"),
    "views": 4759,
    "clicks": 36
  },
  {
    "_id": ObjectId("61e4b18e3f14fb871616d8ca"),
    "campaign_id": 41,
    "creative_id": 144,
    "date": ISODate("2022-01-17T00:00:00Z"),
    "views": 4822,
    "clicks": 27
  }
]

这是分组后的预期结果: 预期结果:

{
    "_id": {
      "campaign": 955,
      "date": ISODate("2022-01-16T00:00:00Z")
    },
    "creative": [
      143: {clicks: XXXX, views:XXXX}
      146: {clicks: XXXX, views:XXXX},
      142: {clicks: XXXX, views:XXXX},
      ...

    ]
  },

https://mongoplayground.net/p/oZNxQNb250R

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    你可以这样做:

    db.collection.aggregate([
      {
        "$sort": {
          "date": 1
        }
      },
      {
        "$group": {
          "_id": {
            date: "$date",
            campaign: "$campaign_id",
            creative_id: "$creative_id"
          },
          views: {
            $sum: "$views"
          },
          clicks: {
            $sum: "$clicks"
          }
        }
      },
      {
        "$group": {
          "_id": {
            date: "$_id.date",
            campaign: "$_id.campaign"
          },
          data: {
            $push: {
              k: {
                "$toString": "$_id.creative_id"
              },
              v: {
                views: "$views",
                clicks: "$clicks"
              }
            }
          }
        }
      },
      {
        $project: {
          _id: 1,
          creative: {
            "$arrayToObject": "$data"
          }
        }
      }
    ])
    

    Mongo Playground

    请注意,我添加了一个额外的$group 阶段,这是按creative_id 分组并汇总它的所有视图和点击次数。如果这个阶段是多余的,你可以删除这个阶段,但是它可以工作。

    【讨论】:

    • 如何不将日期和活动嵌套到 _id 中?就像预期的输出一样
    • 预期输出在_id 中有这些,但您可以更改最后一个项目阶段,如下所示:mongoplayground.net/p/oRtShYytlpD
    猜你喜欢
    • 2015-08-21
    • 2014-03-10
    • 2018-10-30
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多