Mongo 分组查询

Mongo Group By query

我将数据存储在结构如下的 Mongo 集合中:

 {
    "numberAtPending" : 3,
    "numberAtInProgress" : 5,
    "numberAtCancelled" : 1,
    "numberAtShipped" : 50,
    "timeOfRequest" : ISODate("2022-01-10T12:52:15.813Z"),
    "requestingSupplier" : "SUPPLIER_1",
},
{
    "numberAtPending" : 5,
    "numberAtInProgress" : 3,
    "numberAtCancelled" : 4,
    "numberAtShipped" : 35,
    "timeOfRequest" : ISODate("2022-01-15T09:11:02.992Z"),
    "requestingSupplier" : "SUPPLIER_1",
},
{
    "numberAtPending" : 12,
    "numberAtInProgress" : 3,
    "numberAtCancelled" : 1,
    "numberAtShipped" : 21,
    "timeOfRequest" : ISODate("2022-01-10T14:21:55.221Z"),
    "requestingSupplier" : "SUPPLIER_2",
}

我希望构建一个查询,让我通过 requestingSupplier 总结每个条目和组中的每个计数。

例如,我想回答这个问题,对于 22 年 1 月,每个实体的总和是多少,并得到类似于以下的回复:-

"TotalNumberAtPending": 300
"TotalNumberAtInProgress" : 150,
"TotalNumberAtCancelled" : 70,
"TotalNumberAtShipped" : 400
"Supplier" : "SUPPLIER_1",

"TotalNumberAtPending": 230
"TotalNumberAtInProgress" : 110,
"TotalNumberAtCancelled" : 40,
"TotalNumberAtShipped" : 300
"Supplier" : "SUPPLIER_2",

非常感谢任何帮助! 谢谢和问候

您可以试试这个查询(我假设您显示的输出是一个示例而不是实际值,因为我不知道您可以从哪里获得 300、150、400...)

所以,试试这个:

您有两个选项可以匹配两个日期范围内的值。如果你想输入月份和年份的名称,你可以尝试这样的:

  • $expr$eq$year and $month 结合使用。然后您可以使用所需月份或年份的数字作为输入。
{
  "$match": {
    "$expr": {
      "$and": [
        {
          "$eq": [
            {
              "$month": "$timeOfRequest"
            },
            1
          ]
        },
        {
          "$eq": [
            {
              "$year": "$timeOfRequest"
            },
            2022
          ]
        }
      ]
    }
  }
}

或者您可以按日期范围进行匹配。如果你想获取 01-2022 的所有文档,你可以使用这个 $match 阶段,其中范围是从一月的第一秒(相等)到二月的第一秒(不相等,所以是最后一秒一月)。

{
  "$match": {
    "timeOfRequest": {
      "$gte": ISODate("2022-01-01T00:00:00Z"),
      "$lt": ISODate("2022-02-01T00:00:00Z")
    }
  }
}

因此,完成过滤器后,您只需像这样使用 $group 即可生成所需的字段值。

{
  "$group": {
    "_id": "$requestingSupplier",
    "TotalNumberAtPending": {
      "$sum": "$numberAtPending"
    },
    "TotalNumberAtInProgress": {
      "$sum": "$numberAtInProgress"
    },
    "TotalNumberAtCancelled": {
      "$sum": "$numberAtCancelled"
    },
    "TotalNumberAtShipped": {
      "$sum": "$numberAtShipped"
    },
    "Supplier": {
      "$first": "$requestingSupplier"
    }
  }
}

示例here and here