【问题标题】:Why MongoDB Date range query returning emtpy result when querying for same date and one day before?为什么MongoDB日期范围查询在查询同一日期和前一天时返回空结果?
【发布时间】:2020-08-16 18:05:30
【问题描述】:

我有一个 mongodb 集合,其中存储购买视频的用户的付款信息

这是内容:

{
    "_id" : ObjectId("5ea17279ca73ec19f84ac39a"),
    "createdAt" : ISODate("2020-04-23T10:48:25.920Z"), // 23 Apr 2020
    "updatedAt" : ISODate("2020-04-23T10:48:25.920Z"),
    "accountId" : "0000",
    "postId" : ObjectId("5e8da8533efaa66ce53bd3bb"),
    "paidBy" : ObjectId("5e92e9ffda29d826d46f7562"),
    "paidGet" : ObjectId("5e465194366a412b7107a1c8"),
    "chargeId" : "0520114401000000538",
    "status" : "Charging",
    "isDeleted" : false,
    "chargeAmount" : "12",
    "transferAmount" : "0",
    "postPrice" : "1.00",
    "__v" : 0
}
{
    "_id" : ObjectId("5ea173a9ca73ec19f84ac39c"),
    "createdAt" : ISODate("2020-04-23T10:53:29.957Z"), //23 Apr 2020
    "updatedAt" : ISODate("2020-04-23T10:53:29.957Z"),
    "accountId" : "0000",
    "postId" : ObjectId("5e8da8533efaa66ce53bd3bb"),
    "paidBy" : ObjectId("5ea1673bca73ec19f84ac392"),
    "paidGet" : ObjectId("5e465194366a412b7107a1c8"),
    "chargeId" : "0520114401000000552",
    "status" : "Charging",
    "isDeleted" : false,
    "chargeAmount" : "12",
    "transferAmount" : "0",
    "postPrice" : "1.00",
    "__v" : 0
}

我的问题:

我需要根据 createdAt 字段的日期范围查询集合:

我正在使用$gte$lte 进行查询

现在我需要查找 2020 年 4 月 23 日发生的付款

我的查询是:

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-22") , "$lte" : ISODate("2020-04-23")}}).pretty()

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-23") , "$lte" : ISODate("2020-04-23")}}).pretty()

但是这个查询没有返回任何东西:也就是说,日期范围 22 Apr 20 - 23 Apr 20 && 23 Apr 20 - 23 Apr 20,返回空结果

但是如果我在 4 月 24 日 [22 Apr 20 - 24 Apr 20] 添加额外的一天,则此查询有效

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-22") , "$lte" : ISODate("2020-04-24")}}).pretty()

还有这个:[20 年 4 月 23 日 - 20 年 4 月 24 日]

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-23") , "$lte" : ISODate("2020-04-24")}}).pretty()

日期 D => 查找日期 = 2020 年 4 月 23 日:

所以我的问题是,如果我给出的日期范围从该日期 D 的前一天开始并在同一日期 D [20 Apr 20 - 23 Apr 20] 结束......没有结果:

如果我在开始和结束时给出相同的日期 D,[20 年 4 月 23 日 - 20 年 4 月 23 日]...没有结果返回

但如果我在结束日期多给了一天,结果就会出现 [22 Apr 20 - 24 Apr 20]

如果开始日期是 D 日期,结束日期是多一天,结果即将到来:[23 Apr 20 - 24 Apr 20]


为什么会出现这种奇怪的匹配?请帮帮我

【问题讨论】:

  • 那是因为当你指定像ISODate("2020-04-23")这样的日期时,它的意思是2020-04-23 00:00:00,因此它将包括那天的记录。

标签: mongodb date mongoose mongodb-query


【解决方案1】:

如果你仔细观察ISODate("2020-04-23T10:48:25.920Z"),你会注意到它是在2020-04-2310:48:25.920 上创建的。因此,当您执行ISODate("2020-04-23") 时,它会导致ISODate("2020-04-23T00:00:00.000Z") 这就是您没有得到任何结果的原因。所以你最初的两个失败的查询必须是这样的:

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-22") , "$lt" : ISODate("2020-04-24")}}).pretty()

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-23") , "$lt" : ISODate("2020-04-24")}}).pretty()

因此,当您执行"$lt" : ISODate("2020-04-24") 时,它将确保不会提取来自"2020-04-24" 的任何文档,因为我们正在检查createdAt < ISODate("2020-04-24T00:00:00.000Z")

【讨论】:

  • 其实流程是,在网站中,用户选择日期范围22 apr - 23 apr,什么都没有
  • 那么我必须如何更改我的查询?
  • 这种格式有效 :: db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-22T00:00:00.000Z") , "$lte" : ISODate("2020-04-23T23:59:59.999Z")}}).pretty()
  • @LordCommander :当用户选择 22 - 23 时,正如我上面给出的那样,您需要在 22 - 24 之间进行搜索,您的 api 代码必须在使用查询访问 db 之前处理此问题。所以你需要像这样的'> 22 00:00 - 22 00:00 -
  • @LordCommander 哦,你已经评论过了,我没注意到是的,正确的,这就是你需要做的事情,很容易得到 24 或“23 23:59”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2018-09-18
  • 1970-01-01
相关资源
最近更新 更多