【问题标题】:Pymongo date query in "DD/MM/YYYY" format“DD/MM/YYYY”格式的 Pymongo 日期查询
【发布时间】:2016-07-24 04:06:32
【问题描述】:

我有一个 mongodb 集合,其中包含以下字段之一:

u'Date': u'15/03/2016'

现在,根据我的理解,u 意味着字符串只是 unicode,这很好。我正在使用 Django 和 pymongo 来允许用户选择 2 个日期并在我的数据库中查询这两个日期之间的内容:

number = coll.find({"Date": {'$gt': startDate}, "Date": {'$lt': endDate}}).count()

我的 startDate 和 endDate 都采用“DD/MM/YYYY”格式。然而,我收到的是一些垃圾数据。如何正确查询 python-mongo 中的日期?

P.S 根据我的理解,这两个结果之间的逗号会导致 'AND' 查询对吗?

【问题讨论】:

  • 使用日期而不是字符串
  • 日期是什么意思?我无法更改数据库中的任何内容,数据由外部客户端提供。

标签: python django mongodb datetime pymongo


【解决方案1】:

如果日期以字符串形式存储在数据库中,那么当您使用运算符$gt$lt 时,操作是字符串比较,而不是日期比较。这意味着例如:"15/03/2016 < 16/02/2016",因为 5 按词汇顺序排在 6 之前。 为了使字符串比较起作用,日期需要以一种格式存储,以便“较小”的日期始终表示为“较小”的字符串。例如使用YYYY/MM/DD

因此,如果您不想在 python 中进行比较,您可以更改日期格式,或者将日期作为日期存储在数据库中。但在这两种情况下,这意味着更改数据库...

如果在 Python 中做是可以的,那么你可以这样做:

from datetime import datetime

date_format = "%d/%m/%Y"
start_date = datetime.strptime(startDate, date_format)
end_date = datetime.strptime(endDate, date_format)
items = coll.find({})

def compare(c, item):
    item_date = datetime.strptime(item['Date'], date_format)
    if start_date < item_date < end_date:
        return c+1
    else:
        return c

count = reduce(compare, items, 0)

【讨论】:

  • 感谢您的回答!可悲的是我无法更改数据库,我也想不出在 python 中查询它的简单方法.. ;/
  • @PawełLaskowski,实际上我只是认为您可能有更好的解决方案:您可以使用 map_reduce engine 在数据库运行的 javascript 函数中进行比较。但他超出了我目前对 mongodb 的了解。
  • @PawełLaskowski,没有注意到你在 python 中也遇到了麻烦,用建议编辑了我的答案:)
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多