【问题标题】:Multiple Group By with condition in MongoDBMongoDB中具有条件的多个分组依据
【发布时间】:2021-03-26 20:38:57
【问题描述】:

我有字段,group_idcategoryaccountskurevenue。我想做一个聚合,其中收入分别由group_idcategoryskuaccount 分组,在sku 中将有两个部分,一个有逗号,一个有逗号不是。我该怎么做?

例如,如果我的数据是

[
  {
    "group_id": "ABC",
    "category": "test",
    "account": "abc1",
    "sku": "grre,qrvf",
    "revenue": 100,
  },
  {
    "group_id": "ABC2",
    "category": "test",
    "account": "abc",
    "sku": "grre,qrvf",
    "revenue": 100,
  },
  {
    "group_id": "ABC3",
    "category": "test2",
    "account": "abc2",
    "sku": "qwe",
    "revenue": 100,
  },
  {
    "group_id": "ABC",
    "category": "test2",
    "account": "abc",
    "sku": "qwe",
    "revenue": 100,
  },
  {
    "group_id": "ABC2",
    "category": "test3",
    "account": "abc2",
    "sku": "asd,fgh",
    "revenue": 100,
  },
  {
    "group_id": "ABC",
    "category": "test3",
    "account": "abc",
    "sku": "asd,fgh",
    "revenue": 100,
  },
  {
    "group_id": "ABC3",
    "category": "test",
    "account": "abc2",
    "sku": "grre,qrvf",
    "revenue": 100,
  }
]

那么结果应该是这样的

[
  {groups: [{group_id: "ABC", "revenue": 300}, {group_id: "ABC2", "revenue": 200}, {group_id: "ABC3", "revenue": 200}]},
  {categories: [{category: "test", "revenue": 300}, {category: "test2", "revenue": 200}, {category: "test3", "revenue": 200}]},
  {accounts: [{account: "abc", "revenue": 300}, {account: "abc2", "revenue": 100}, {account: "abc3", "revenue": 300}]},
  {skus: [{single: [{sku: "qwe", revenue: 100}, {sku: "iou", revenue: 100}]}, {multi: [{sku: "grre,qrvf", revenue: 300}, {sku: "asd,fgh", revenue: 200}]}]},
]

【问题讨论】:

标签: mongodb aggregation-framework


【解决方案1】:

您可以使用$facet 在一次往返中分别运行多个聚合,并使用$indexOfBytes 拆分skus

db.collection.aggregate([
    {
        $facet: {
            group: [ { $group: { _id: "$group_id", revenue: { $sum: "$revenue" } } }, { $project: { _id: 0, group: "$_id", revenue: 1 } } ],
            categories: [ { $group: { _id: "$category", revenue: { $sum: "$revenue" } } }, { $project: { _id: 0, category: "$_id", revenue: 1 } } ],
            accounts: [ { $group: { _id: "$account", revenue: { $sum: "$revenue" } } }, { $project: { _id: 0, account: "$_id", revenue: 1 } } ],
            skus: [ 
                {  $group: { _id: "$sku", revenue: { $sum: "$revenue" } } }, 
                {  $group: { _id: null, aggregates: { $push: { sku: "$_id", revenue: "$revenue" } } } }, 
                {  $project: { 
                    _id: 0,
                    single: { $filter: { input: "$aggregates", cond: { $eq: [ { $indexOfBytes: [ "$$this.sku", "," ] }, -1 ] } } },
                    multi: { $filter: { input: "$aggregates", cond: { $ne: [ { $indexOfBytes: [ "$$this.sku", "," ] }, -1 ] } } },
                },
                }
            ],
        }
    }
])

Mongo Playground

【讨论】:

  • 不错,skus 的一个小问题从 { $group: { _id: null, aggregates: { $push: { sku: "$_id", revenue: 1 } } } },{ $group: { _id: null, aggregates: { $push: { sku: "$_id", revenue: "$revenue" } } } }, --- revenue: 1$revenue"
  • @mickl 只是一个后续问题。如果我想要skus 格式为{skutype: "single", revenue: 200}, {skutype: "multi", revenue: 500}。我该怎么做?
  • @khateeb 试试这个方法:mongoplayground.net/p/MUf9mTA4Dc9
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 2019-12-03
相关资源
最近更新 更多