集合中的MongoDB/Python日期(用于查询)

2024-09-20 04:06:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我今天刚开始使用mongoDB(版本3.6.8),我很喜欢它

我读到应该可以在数据库中直接有一个日期对象,但我无法让它工作

我还想知道这是否是最好的解决方案,或者我是否应该将日期存储为“Epoch millis”

我正在尝试使用$dateFromString关键字,该关键字应该有效,但我收到以下错误:

bson.errors.InvalidDocument: key '$dateFromString' must not start with '$'

我的代码如下所示:

from datetime import date
import pymongo

dbcli   = pymongo.MongoClient('mongodb://192.168.1.8:27017')
db      = dbcli['washbase']
col     = db['machine']

def conv(dato):
    return {
            '$dateFromString': {
                'dateString': dato,
                'format': '%Y-%m-%d',
                'timezone':'Europe/Copenhagen',
                }
            }
    
today = date.today().isoformat()

data = {
        'day': conv(today),
        'time':12,
        'room':'2B',
        }


col.insert_one(data)

我之所以需要数据库中的日期对象,是因为我想对数据进行条件查询,以便数据库只发送我需要的数据。所以我希望做这样的事情

result = col.find(
        {
            'day' : {
                '$gt' : {
                    '$date' : '2020-01-01'
                    }
                }
            }
        )
for x in results:
    print(x)

但当我这样做时,应用程序不会打印任何内容


Tags: 对象import数据库dbdatatodaydatecol
1条回答
网友
1楼 · 发布于 2024-09-20 04:06:43

$dateFromString是MongoDB聚合的操作符An aggregation是在MongoDB中创建复杂查询的强大方法。因此,这可能不是您需要的

我建议以正常格式存储日期。因此,您的代码应该如下所示:

from datetime import date
import pymongo

dbcli   = pymongo.MongoClient('mongodb://192.168.1.8:27017')
db      = dbcli['washbase']
col     = db['machine']
    
today = date.today().isoformat()

data = {
        'day': today,
        'time':12,
        'room':'2B',
        }


col.insert_one(data)

如果您关心时区,MongoDB将默认情况下以UTC存储每个日期,将日期中指定的任何时区转换为UTC。读取日期时,您可以将其转换为所需的任何时区

编辑: 编写查询时,请尝试使用实际日期对象。这会将查询日期转换为DB可以理解的实际ISO日期

col.find({'day': {'$gte': ISODate(date.today) }}) 

如果要查找日期范围内的条目,可以执行以下操作:

col.find({'day': {'$gte': ISODate(date.today), '$lte': ISODate(date.today + 24 hours) }}) 

相关问题 更多 >