在mongoDB中按日期分组,同时计算其他字段

问题描述

我已经使用MongoDB仅仅一个星期了,但在实现此结果方面遇到了一些问题:我想按日期对文档进行分组,同时还要跟踪将某个字段设置为某个值的条目数。 / p>

所以,我的文档如下:

    {
    "_id" : ObjectId("5f3f79fc266a891167ca8f65"),"recipe" : "A","timestamp" : ISODate("2020-08-22T09:38:36.306Z")
    }

其中配方为“ A”,“ B”或“ C”。现在,我使用以下pymongo查询按日期对文档进行分组:

mongo.db.aggregate(
    # Pipeline
    [
         # Stage 1
        {
            "$project": {
                "createdAt": {
                    "$datetoString": {
                        "format": "%Y-%m-%d","date": "$timestamp"
                    }
                },"progressivo": 1,"temperatura_fusione": 1
            }
        },# Stage 2
        {
            "$group": {
                "_id": {
                    "createdAt": "$createdAt"
                },"products": {
                    "$sum": 1
                }
            }
        },# Stage 3
        {
            "$project": {
                "label": "$_id.createdAt","value": "$products","_id": 0
            }
        }])

哪个给我这样的结果:

[{"label": "2020-08-22","value": 1},{"label": "2020-08-15","value": 2},{"label": "2020-08-11",{"label": "2020-08-21","value": 5}]

我还想计算每个食谱在每个日期出现多少次。因此,例如,如果在8月21日,我有2个输入为“ A”配方,3个为“ B”配方,0个为“ C”配方,则所需的输出

{"label": "2020-08-21","value": 5,"A": 2,"B":3,"C":0}

您有什么建议吗?

谢谢!

解决方法

您可以喜欢以下内容,您所做的很棒。之后,

  1. 在第二个分组中,我们只获得总价值和每个食谱的价值
  2. $map用于浏览/修改每个对象
  3. $arrayToObject用于将我们通过映射(键:值对)映射到对象所做的操作隐蔽到数组
  4. $ifNull用于,有时您的数据可能没有“ A” “ B” “ C” 。但是,如果没有名称作为预期输出,则需要将值设置为 0

这是代码

[
  {
    "$project": {
      "createdAt": {
        "$dateToString": {
          "format": "%Y-%m-%d","date": "$timestamp"
        }
      },recipe: 1,"progressivo": 1,"temperatura_fusione": 1
    }
  },{
    "$group": {
      "_id": {
        "createdAt": "$createdAt","recipeName": "$recipe",},"products": {
        $sum: 1
      }
    }
  },{
    "$group": {
      "_id": "$_id.createdAt",value: {
        $sum: "$products"
      },recipes: {
        $push: {
          name: "$_id.recipeName",val: "$products"
        }
      }
    }
  },{
    $project: {
      "content": {
        "$arrayToObject": {
          "$map": {
            "input": "$recipes","as": "el","in": {
              "k": "$$el.name","v": "$$el.val"
            }
          }
        }
      },value: 1
    }
  },{
    $project: {
      _id: 1,value: 1,A: {
        $ifNull: [
          "$content.A",0
        ]
      },B: {
        $ifNull: [
          "$content.B",C: {
        $ifNull: [
          "$content.C",0
        ]
      }
    }
  }
]

工作Mongo playground