我有一个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]
为什么这个奇怪的匹配?请帮助我
答案 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"
。