MongoDB/Python - 集合中的日期(用于查询)
MongoDB/Python - Date in collection (to use for query)
今天刚开始用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)
但是当我这样做时,应用程序不打印任何内容。
$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。读取日期时,您可以将它们转换为您需要的任何时区。
编辑:
编写查询时,请尝试使用实际的日期对象。这会将查询日期转换为数据库可以理解的实际 ISO 日期。
col.find({'day': {'$gte': ISODate(date.today) }})
如果您要查找某个日期范围内的条目,您可以执行以下操作:
col.find({'day': {'$gte': ISODate(date.today), '$lte': ISODate(date.today + 24 hours) }})
今天刚开始用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)
但是当我这样做时,应用程序不打印任何内容。
$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。读取日期时,您可以将它们转换为您需要的任何时区。
编辑: 编写查询时,请尝试使用实际的日期对象。这会将查询日期转换为数据库可以理解的实际 ISO 日期。
col.find({'day': {'$gte': ISODate(date.today) }})
如果您要查找某个日期范围内的条目,您可以执行以下操作:
col.find({'day': {'$gte': ISODate(date.today), '$lte': ISODate(date.today + 24 hours) }})