【问题标题】:return true of false if any data exists between two dates in Mongo如果在 Mongo 的两个日期之间存在任何数据,则返回 true 或 false
【发布时间】:2016-02-15 20:37:37
【问题描述】:

我正在尝试检查 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-01 至 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}}

因为在这两个日期之间显示“ANY”数据,但我需要的是“AND”。如果某一天没有数据,则查询必须返回 False。

【问题讨论】:

  • 我认为您的英语正在下降,您的意思是说您希望范围内的“每天”从您的查询中返回结果以使条件为真。对吗?

标签: python mongodb mongodb-query pymongo aggregation-framework


【解决方案1】:

您似乎想要的基本想法是确保返回的天数与范围内的所有天数连续。这意味着“计算”结果范围之间的数据“不同”天数等于日期本身之间的天数。

为此,您可以使用.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 到日期之间的差异,则所有日期都存在。

【讨论】:

  • 非常感谢!
【解决方案2】:

听起来您只是想确保您拥有这期间所有日子的数据。我建议你做一些辅助函数:

from datetime import datetime
def is_complete(min_date, max_date):
    days = (datetime.strptime(max_date,"%Y-%d-%m")-datetime.strptime(min_date,"%Y-%d-%m")).days
    # do your query now
    min_date = parse(min_date)
    max_date = parse(max_date)
    #... rest of your query
    if colLastData.find(query_mongo,projection={'data':0}).count() == days:
        return colLastData, True
    else:
        return colLastData, False


is_complete("2015-11-01", "2015-11-20") # would return your query data in the first element and true or false in the second

【讨论】:

  • 嗨!是啊!这是我的最后一个选择,但我想知道 mongo 中是否存在一些查询来做到这一点!
  • 我很确定没有原生 Mongo 查询,尽管可能有比这更好的方法 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2021-09-11
  • 2014-09-02
相关资源
最近更新 更多