mongoose 尝试根据以下条件获取数据库的Mongo问题

93ze6v8z  于 2023-01-17  发布在  Go
关注(0)|答案(1)|浏览(118)

我正试图获得每天的电子邮件计数的基础上,在电子邮件状态发送和失败的条件。

db.emails.aggregate([
   {
      "$group":{
         "_id":{
            "$dateToString":{
               "format":"%Y-%m-%d",
               "date":"$createdAt"
            },
            {
               "status":"$sEmailStatus"
            }
         }
      }
   }
])
mkshixfv

mkshixfv1#

我认为您正在寻找这个查询:
您的_id$group的格式不正确,所以您可以尝试这种方式(您几乎就成功了)。
这里的技巧是按日期分组解析字符串,只获取日期(即按日期分组),然后将$sum$cond一起使用。如果状态为"发送",则将sent加1。如果状态为"失败",则将failed加1。
最后是$project阶段,把日期放进date域,而不是_id域,顺便说一下,这是可选的。

db.collection.aggregate([
  {
    "$group": {
      "_id": {
        "id": {
          "$dateToString": {
            "date": "$createdAt",
            "format": "%Y-%m-%d"
          }
        }
      },
      "sent": {
        "$sum": {
          "$cond": {
            "if": {
              "$eq": [
                "$sEmailStatus",
                "Send"
              ]
            },
            "then": 1,
            "else": 0
          }
        }
      },
      "failed": {
        "$sum": {
          "$cond": {
            "if": {
              "$eq": [
                "$sEmailStatus",
                "Failed"
              ]
            },
            "then": 1,
            "else": 0
          }
        }
      }
    }
  },
  {
    "$project": {
      "_id": 0,
      "date": "$_id.id",
      "sent": 1,
      "failed": 1
    }
  }
])

示例here
another approach也是使用$size$filter。但是过滤两次数组我假设比直接求和到组中更糟糕。

相关问题