最近,我正在使用一个MongoDB数据库.下面是我需要运行查询的文档的数据模型:

    {
      "creation_date": {
        "$date": {
          "$numberLong": "1641981205813"
        }
      },
      "user_id": {
        "$oid": "61dedd8b7a520461dd78016b"
      },
      "products": [
        {
          "_id": {
            "$oid": "61dede397a520461dd7818bd"
          },
          "product_id": {
            "$oid": "615071ae8b66e1e9a3d6ea50"
          },
          "payment": true,
          "support_all_payment": false,
          "term_ids": null
        }
      ],
      "carts_info": [
        {
          "_id": {
            "$oid": "61dede397a520461dd7818be"
          },
          "support_type": null,
          "support_price": 0,
          "product_price": 11000,
          "product_type": "all",
          "final_price": 11000,
          "product_id": {
            "$oid": "615071ae8b66e1e9a3d6ea50"
          }
        }
      ],
      "_des": "initial_payment",
      "_type": "online",
      "_token": "9e0cb4d111f642f1a6f482bb04f1f57b",
      "_price": 11000,
      "_status": "unpaid",
      "_terminal_id": "12605682",
      "__v": 0,
      "additional_information": {
        "saman_bank": {
          "MID": "0",
          "ResNum": "61dede387a520461dd7818bb",
          "State": "CanceledByUser",
          "TraceNo": "",
          "Wage": "",
          "Rrn": "",
          "SecurePan": "",
          "HashedCardNumber": "",
          "Status": "1"
        }
      }
    }

此集合是用户订单.我需要清点今天的订单.因此,我需要一个与以下SQL相同的MongoDB Compass等价查询:

    SELECT count(1) num,
           date(creation_date) date
    FROM orders
    WHERE date(creation_date) = "2023-02-16"
    GROUP BY date

你知道我如何在MongoDB Compass上运行这个逻辑吗?

推荐答案

使用$dateTrunc执行仅日期操作.

db.collection.aggregate([
  {
    "$match": {
      $expr: {
        $eq: [
          {
            $dateTrunc: {
              date: "$creation_date",
              unit: "day"
            }
          },
          ISODate("2022-01-12")
        ]
      }
    }
  },
  {
    $group: {
      _id: {
        $dateTrunc: {
          date: "$creation_date",
          unit: "day"
        }
      },
      num: {
        $sum: 1
      }
    }
  }
])

Mongo Playground


对于OP的MongoDB v3.6,我们可以使用$dateToString对仅限日期的字符串执行字符串比较.

db.collection.aggregate([
  {
    $addFields: {
      dateOnly: {
        "$dateToString": {
          "date": "$creation_date",
          "format": "%Y-%m-%d"
        }
      }
    }
  },
  {
    $match: {
      dateOnly: "2022-01-12"
    }
  },
  {
    $group: {
      _id: null,
      num: {
        $sum: 1
      }
    }
  }
])

Mongo Playground

Sql相关问答推荐

如何重用表值用户定义函数调用的结果?

用于动态查询情况的存储过程常识模式

每组显示一行(表1中的分组值),表2中的不同列表用逗号分隔

如何从JSON数组中 Select 多个值

从列中提取子字符串的ORDER BY CASE语句

在一个子查询中签入ID';S,如果未返回,则签入另一个子查询

将FLOAT转换为VARBINARY,然后再转换回FLOAT

SQL Athena/prest判断值是否在嵌套的json数组中

SQL将三个表中的三列组合为一列

为什么左联接结果在MS Access数据库中不匹配

对现有记录进行分组

Postgresql - 如何根据阈值计算累积和

清理 XML 数据

达到特定值时,从0开始累加求和

使用 PL/PGSQL 函数 Select 返回多条记录

在 SQL 查询中创建滚动日期

postgres按组消除分区中的NULLS

根据条件列出不同的值

使用 JSON_BUILD_OBJ 从 Postgres 返回 JSON

如何在 Trino/Presto 中过滤掉 map 中的某些键?