我有一个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.920
的2020-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")
。