具有多个子组的mongodb聚合

时间:2018-04-10 12:25:08

标签: mongodb mongodb-query aggregation-framework aggregation

我有一个包含与此类似的文档的集合:

[
    {
        "_id": ObjectId("..."),
        "date": ISODate("..."),
        "type": "TypeA",
        "color": "ColorA",
        "soldFor": 12.15
    },
    {
        "_id": ObjectId("..."),
        "date": ISODate("..."),
        "type": "TypeA",
        "color": "ColorB",
        "soldFor": 13.15
    },
    {
        "_id": ObjectId("..."),
        "date": ISODate("..."),
        "type": "TypeB",
        "color": "ColorA",
        "soldFor": 12.15
    },
    {
        "_id": ObjectId("..."),
        "date": ISODate("..."),
        "type": "TypeB",
        "color": "ColorB",
        "soldFor": 12.15
    }
]

我知道这不是存储此类信息的好方法,但遗憾的是我对此没有任何影响。 我需要从集合中得到的东西是这样的:

[
    2017: {
        typeA: {
            colorA: {
                sum: 125.00
            },
            colorB: {
                sum: 110.00
            }            
        },
        typeB: {
            colorA: {
                sum: 125.000
            }
        }        
    },
    2016: {
        typeA: {
            colorB: {
                sum: 125.000
            }
        }
    }
]

目前我有两个小组阶段,按年分组给我一切,但我不知道如何获得其他两个小组。建立总和将是一件好事,但我确信我可以弄清楚如何在一个小组中完成。

到目前为止,我的管道看起来像这样:

[
    {
      $group: {
        _id: { type: '$type', color: '$color', year: { $year: '$date' } },
        docs: {
          $push: '$$ROOT'
        }
      }
    },
    {
      $group: {
        _id: { year: '$_id.year' },
        docs: {
          $push: '$$ROOT'
        }
      }
    }
]

导致类似这样的事情:

[
    {
        "_id": {
            "year": 2006
        },
        "docs": {
            "_id": {
                "type": "typeA",
                "color": "colorA",
                "year": 2006
            },
            "docs": [
                {
                    ... root document
                }
            ]
        }
    },
    {
        "_id": {
            "year": 2016
        },
        "docs": [
            {
                "_id": {
                    "type": "typeA",
                    "color": "colorB",
                    "year": 2016
                },
                "docs": [
                    {
                        ... root document
                    }
                ]
            }
            ... more docs with three keys in id
        ]
    }
]

非常感谢帮助!

1 个答案:

答案 0 :(得分:0)

使用MongoDB 3.4.4及更新版本中的一组运算符,即 $addFields $arrayToObject {{3您可以撰写如下所示的管道来获得所需的结果:

@echo off & setlocal
set "MySearchString=X"
for /f "delims=" %%i in ('dir /b /s /a-d ^| findstr /i "%MySearchString%"') do echo del "%%~i"