【问题标题】:Can $regex and $gte/$lte for strings in mongodb be used together?mongodb中字符串的$regex和$gte/$lte可以一起使用吗?
【发布时间】:2021-11-28 04:55:06
【问题描述】:

我在 mongodb 数据库中的交易日期格式为“7/1/2021 12:30:48 PM”(字符串为 M/D/YYYY)。在 React 方面,我输入了两个日期:From date 和 To Date,它们都是格式为 YYYY-MM-DD 的字符串。我正在使用下面的代码来查找介于 From 和 To 日期之间的交易。我收到演员表错误,但所有日期都是字符串格式。它只适用于一个没有 $gte 和 $lte 的日期。

错误消息: CastError:模型“事务”的路径“Trandate”中值“{'$regex':'7/1/2021','$options':'$i'}”(类型对象)的值转换为字符串失败

const chooseWinner = await Transaction.find(
    {
      ContCode: CountryCode,
      CurrCode: CurrCode,
      CorrOrgCode: CorrorgCode,
      ServCode: ServCode,
      BranchCode: BranchCode,
      Trandate: {$gte: {$regex : SDate, $options: "$i"}},
      Trandate: {$lte: {$regex : EDate, $options: "$i"}},
    },
    "CustomerCode ReferenceNo Trandate "
  );

我还把 from 和 to 日期更改为以下格式:

var SDate = new Date(FromDate).toLocaleDateString("hi-IN",{month:'numeric'})+"/"+
                  new Date(FromDate).toLocaleDateString("hi-IN",{day:'numeric'})+"/"+
                  new Date(FromDate).toLocaleDateString("hi-IN",{year:'numeric'});
  console.log("frmdate: ",SDate);
  

  var EDate = new Date(ToDate).toLocaleDateString("hi-IN",{month:'numeric'})+"/"+
                  new Date(ToDate).toLocaleDateString("hi-IN",{day:'numeric'})+"/"+
                  new Date(ToDate).toLocaleDateString("hi-IN",{year:'numeric'});
  console.log("enddate: ",EDate); 

      

【问题讨论】:

    标签: javascript node.js reactjs regex mongodb


    【解决方案1】:

    不知道正则表达式和 $gte/$lte 一起,但似乎问题在于日期格式。为什么不使用诽谤

    {Trandate:{$gte:ISODate(FromDate),$lt:ISODate(ToDate)}}

    【讨论】:

    • 不,它不适用于 ISODate
    • 你的数据库中 Trandate 的数据类型是什么?
    • 数据库中的字符串
    • 如果它存储为字符串,它如何查询 gte 或 lte ?这不可能。我建议您在数据库中管理适当的数据类型,以避免当前的问题以及任何未来的变化。
    • 我必须在日期存储为字符串的 ERP 系统中比较日期。因此,我无法更改来自该 ERP 系统的交易日期的数据类型。没有 gte 和 lte 它可以工作,所以认为它也适用于这种情况
    【解决方案2】:

    要回答直接提出的问题,不,$regex 查询运算符不能嵌套在这样的不等式运算符中。

    $regex 运算符返回 true 或 false 指示字符串是否匹配,因此即使允许,嵌套比较也将有效地“小于或等于(布尔值)”。由于 mongodb 查询运算符是类型敏感的,所以比较总是错误的。

    回答隐含的问题如何按指定范围查询这些日期?

    以您显示的字符串格式存储的日期无法与不等式运算进行有意义的比较。

    例如,这里有几个按顺序排列的日期:

        "6/1/2022 1:30 PM",
        "7/1/2021 12:30:48 PM",
        "7/1/2021 9:30:48 AM",
        "7/12/2021 12:30:48 PM",
        "7/2/2021 12:30:48 PM",
        "8/1/2001 8:55:00 AM"
    

    如果您要查询 {$lte: "8/1/2001 8:55:00 AM"},所有 6 个日期都会匹配。

    为了查询日期范围,您需要:

    • 聚合查询
      使用读取集合中每个文档的管道,使用 $dateFromString 聚合运算符将字符串转换为日期,然后在转换后的字段上进行匹配。这是不可扩展的,并且在任何非平凡负载下都不会表现良好。
    • 修改架构
      更改应用程序以将字符串日期转换为 Date 对象,然后再存储到数据库中。所有现有文件也需要修改。这将允许您直接使用 $gte$lte 查询字段,并允许使用索引来提高性能。

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 2015-12-27
      • 2021-09-17
      • 2016-11-17
      相关资源
      最近更新 更多