【问题标题】:MongoDB Query by DateTime with Python使用 Python 按日期时间查询 MongoDB
【发布时间】:2018-05-20 19:16:36
【问题描述】:

我想查询 MongoDB 并返回日期为 2017 年 12 月 6 日的记录。日期格式如下:

u'Date': datetime.datetime(2017, 12, 6, 15, 9, 21, 303000)

那么,如何只查询该条目的年、月和日?我试过了:

date = db.data.find({ 'Date' : {'2017, 12, 6'} },{'Date' : '1'})
for document in date:
     print(date)

返回:“InvalidDocument:无法编码对象:set(['2017, 12, 6'])”。

我也试过了:

date = db.data.find({ 'Date' : {datetime('2017, 12, 6')} },{'Date' : '1'})
for document in date:
    print(date)

返回:“NameError: name 'datetime' is not defined”。

更新...解决方案 我错误地将日期放入 Mongo。我现在用 Python 将日期放入 Mongo,如下所示:

import datetime
import dateutil.parser

# the date
now = datetime.datetime.now()
year = now.year
month = now.month
day = now.day
theDate = str(year) + "-" + str(month) + "-" + str(day)
dateStr = theDate
date = dateutil.parser.parse(dateStr)
# Then put that date into your Mongo insert

这就是我按日期查询的方式。这将提取昨天(今天)之后插入的文档。

import dateutil.parser, datetime
now = datetime.datetime.now()
year = now.year
month = now.month
yesterday = now.day - 1
dateStr = str(year) + "-" + str(month) + "-" + str(yesterday)
date = dateutil.parser.parse(dateStr)

cursor = db.data.find({'Date' : { '$gt' : date}},{'Date':'1'})
for document in cursor:
    print(document)

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    当您说对象存储为 datetime.datetime 时,您指的是什么?自定义对象?

    根据 Mongo 文档,这是他们明确支持的唯一日期对象: https://docs.mongodb.com/v3.4/reference/method/Date/

    来自文档:

    Date() 以字符串或 Date 对象的形式返回日期。

    Date() 在 mongo shell 中以字符串形式返回当前日期。新的 Date() 以 Date 对象的形式返回当前日期。蒙哥壳 用 ISODate 助手包装 Date 对象。 ISODate 采用 UTC。 您可以通过传递给 Date() 方法来指定特定日期 日期时间字符串。例如:

    new Date("") 返回指定的 ISODate 日期。 new Date("") 指定日期时间 在本地日期时间并返回具有指定日期时间的 ISODate 在UTC。 new Date("") 指定 UTC 中的日期时间并返回具有指定日期时间的 ISODate 世界标准时间。

    要创建查询以在 mongo 中搜索日期字段,您可以像这样实例化 ISODate

    db.collection.find({"datefield" : ISODate("YYYY-MM-DDTHH:MM:SS")})
    

    一般来说,这会有些有限的用途,因为时间以毫秒为单位,所以您可能需要执行类似于以下内容的范围查询:

    db.collection.find({"datefield" : {"$gte" : <beginning_of_day_as_ISODate>, "$lte" : <end_of_day_as_ISODate>})
    

    例如:

    {createdDate : {$gte : ISODate("2017-12-06T00:00:00"), $lte : ISODate("2017-12-06T23:59:59")}}
    

    如果您正在使用自定义日期对象,或以某种非标准格式存储日期,则您的查询需要针对该对象进行定制。

    【讨论】:

    • 谢谢你,埃里克。在插入这些记录之前,我这样定义日期:date = datetime.now()。我会将其更新为 Mongo 文档所说的内容。
    • 只需要改成:date = datetime.datetime.utcnow()
    【解决方案2】:

    你可以试试这样的

    date = db.data.find({ 'Date' : {new ISODate("2017-12-6T23:59:59Z") } },{'Date' : '1'})
    
    for document in date: 
    print(date)
    

    或者你可以试试这个,

    date = db.data.find({ 'Date' : {new Date(2017,12,6) } },{'Date' : '1'})
    for document in date: 
        print(date)
    

    【讨论】:

    • 谢谢你,阿尼鲁德。不幸的是,这两个都不起作用。我将日期定义为:date = datetime.now(),我认为我需要将其更改为 Mongo 文档建议的内容。
    猜你喜欢
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    相关资源
    最近更新 更多