为什么MongoDB日期范围查询在查询相同日期和前一天时返回emtpy结果



我有一个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&20年4月23日-20年4日23日,返回空结果

但如果我添加额外的一天,即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年4月22日至20年4日23日】。。。无结果:

如果我在开始和结束时给出相同的日期D,[20年4月23日至[20年四月23日]。。。无结果返回

但如果我在结束日期多给一天时间,结果就会出来[20年4月22日至[20年四月24日]

此外,如果开始日期是日期D,结束日期是额外的一天,结果就会到来:[23 Apr 20-24 Apr 20]


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

如果您仔细观察它的ISODate("2020-04-23T10:48:25.920Z"),您会注意到它是在10:48:25.9202020-04-23上创建的。所以当你做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")

相关内容

  • 没有找到相关文章

最新更新