MongoDB / Python - Дата в коллекции (для использования в запросе) - PullRequest
1 голос
/ 12 июля 2020

Я только начал использовать 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)

Но когда я делаю это, приложение ничего не печатает.

1 Ответ

1 голос
/ 12 июля 2020

$dateFromString - оператор для агрегирования MongoDB. Агрегирование - мощный способ создания сложных запросов в 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 сохраняет каждую дату в UT C по умолчанию, конвертируя любой часовой пояс, указанный в вашей дате, в UT C . При чтении дат вы можете затем преобразовать их в любой часовой пояс, который вам нужен.

EDIT : при написании запроса попробуйте использовать фактический объект даты. Это преобразует дату запроса в фактическую дату ISO, которую может понять БД.

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

Если вы пытаетесь найти записи, которые попадают в диапазон дат, вы можете сделать что-то вроде:

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