我正在尝试检查 Mongo 中两个日期之间是否存在任何日期(我正在使用 pymongo)。
id_categoria = 885
min_date = parse("2015-11-01")
max_date = parse("2015-11-20")
query_mongo = {"categoryId" : id_categoria,"dataDate":{"$lte":max_date,"$gte":min_date}}
print colLastData.find(query_mongo,projection={'data':0}).count()
打印返回这两个日期之间的数据总数,例如,如果我在 2015-11-01 和 2015-11-20 之间只有 10 天,则打印将返回 10。但我需要的是打印返回错误,因为我有 10 天没有数据。
2015年11月1日至2015年11月10日:有数据!
2015-11-11 至 2015-11-20 :没有数据!
我用这个,但是同一件事:
print colLastData.find(query_mongo,projection={'data':0}).count() > 0
如果范围在 Mongo 中只有一天,则打印将返回 True,这是错误的,因为我想要的是仅当 mongo 在所有这些天之间都有数据时才返回 True!
<小时/>更新1: 我觉得这个查询可以与 OR 配合使用。
query_mongo = {"categoryId" : id_categoria,"dataDate":{"$lte":max_date,"$gte":min_date}}
因为显示这两个日期之间的“任何”数据,但我需要的是“AND”。如果有一天没有数据,查询必须返回 False。
最佳答案
您似乎想要的基本想法是确保返回的天数与范围内的所有天数连续。这意味着“计算”结果范围之间数据中“不同”的天数等于日期本身之间的天数。
为此,您可以使用 .aggregate()
语句:
days = (datetime.strptime(max_date,"%Y-%d-%m")-datetime.strptime(max_date,"%Y-%d-%m")).days
colLastData.aggregate([
{ "$match": {
"categoryId" : id_categoria,
"dataDate": { "$lte":max_date, "$gte":min_date }
}},
{ "$group": {
"_id": {
"$subtract": [
{ "$subtract": [ "$dataDate", datetime.datetime.utcfromtimestamp(0) ] },
{ "$mod": [
{ "$subtract": [ "$dataDate", datetime.datetime.utcfromtimestamp(0) ] },
1000 * 60 * 60 * 24
]}
]
}
}},
{ "$group": {
"_id": None,
"count": { "$sum": 1 }
}},
{ "$match": { "count": days } }
])
只有当不同天数等于输入日期之间的天数时,查询才会返回结果。
MongoDB 查询本身不会遍历集合对象以进行相互比较。因此,标准查询无法判断源范围的数据结果中没有“缺失天数”。
但是您可以使用 .aggregate()
等工具创建语句,以便在服务器上为您计算出该逻辑。这基本上是在制作 $group
将四舍五入的日期值计算到一天的开始,然后再次使用 $group
来计算这些出现次数。如果出现 $match
与日期之间的差异,则所有日期都存在。
关于python - 如果 Mongo 中两个日期之间存在任何数据,则返回 true 或 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35418616/