为什么查询相同日期和前一天的MongoDB日期范围查询返回空结果?

时间:2020-05-02 08:05:57

标签: mongodb date mongoose mongodb-query

我有一个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日[20 Apr 22-20 Apr 24]

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

还有这个:[20 Apr 20-20 Apr 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 23] ...没结果:

如果我在开始和结束时输入了相同的日期D,[20 Apr 20-23 Apr 20] ...没有结果返回

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

另外,如果开始日期是日期D,结束日期又是一天,则结果将是:[20 Apr 20-20 Apr 24]


为什么这个奇怪的匹配?请帮助我

1 个答案:

答案 0 :(得分:1)

如果您仔细观察ISODate("2020-04-23T10:48:25.920Z"),会发现它是在2020-04-23的{​​{1}}上创建的。因此,当您执行10: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"