【问题标题】:mongoose : How to find by date that start with a given input (like autocomplete : 25/01/2... , 25/01..)猫鼬:如何按日期查找以给定输入开头的日期(如自动完成:25/01/2...、25/01..)
【发布时间】:2021-01-25 11:17:56
【问题描述】:

我将对象存储在数据库中,例如:

[
   {
      "created_at" : ISODate("2020-03-19T07:27:32.158Z"),
   },
   {
      "created_at" : ISODate("2020-03-19T12:10:19.191Z"),
   }
]

我想查找 created_at (开头)的数据,例如自动完成:25...25/01... , 25/01/202...

我有一个输入日期,我可以获取以下格式的数据:25/01/2021dd/mm/yyyy

结果可以是 2525/0

在这种情况下,我需要找到 created_at : start with 25/0 的数据

类似于方法:$regex: "^" + date有日期

【问题讨论】:

  • 将日期转换为字符串并使用正则表达式
  • 但是如何比较字符串和数据库中的日期:ISODate("2020-03-19T12:10:19.191Z")
  • “将日期转换为字符串”表示将日期(bson 类型 9)转换为字符串(bson 类型 2),例如ISODate("2020-03-19T12:10:19.191Z") 转换为 "19/03/2020"。然后,您可以根据需要对这些字符串进行所有过滤和比较。
  • 为了清楚起见,您可以在应用程序级别(猫鼬模式)将日期转换为字符串,并将其作为额外字段添加到您的文档中。在这种情况下,您需要一次性更新所有现有文档。或者,您可以使用docs.mongodb.com/manual/reference/operator/aggregation/… 将其转换为运行时。它不需要对模型进行任何更改,但对每个请求的计算都相当昂贵。您可以根据数据访问模式选择哪种方法。
  • 任何人都可以提供一个以 $dateToString 为例的聚合作为答案

标签: javascript node.js mongodb date mongoose


【解决方案1】:

使用$dateToString 在运行时转换它的聚合管道示例。在大型集合上可能会非常昂贵,因为它处理每个请求的所有文档并且不能使用索引。

db.collection.aggregate([
  {
    "$addFields": {
      "created_at_str": {
        $dateToString: {
          date: "$created_at",
          format: "%d/%m/%Y" 
        }
      }
    }
  },
  {
    "$match": {
      "created_at_str": {
        $regex: "^" + date
      }
    }
  },
  {
    "$project": {
      "created_at_str": 0
    }
  }
])

一个与https://mongoplayground.net/p/zXJbsUnli3L一起玩的例子

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 2015-12-31
    • 2012-04-29
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多