(Python) Запрос по датам, которые хранятся в виде строк в коллекции mongoDB - PullRequest
1 голос
/ 26 марта 2019

Как можно запросить коллекцию db.collection по датам, когда даты хранятся в виде строк? Поскольку эта база данных велика и расширяется, цикл for для преобразования каждой даты-времени не имеет смысла в долгосрочной перспективе решение.

Я создаю конвейер для запроса коллекции на любые заданные даты, но каждый пробный запрос приводит к пустому списку [].

формат даты: "ts": "2018-09-26T21: 02: 19 + 00: 00"

Я ищу решение, которое не позволяет преобразовать ключ datetime в цикле for, потому что база данных растет, и это займет больше времени, чем выполнение запроса без datetime, преобразование в pandas, а затем преобразование в datetime позже в сценарии.

Я пробовал несколько попыток из разных сообщений SO, и они приводят к пустым результатам: 1.

n = db.collection.find({'ts':{'$lt':datetime.now(), '$gt':datetime.now() - timedelta(hours=10000)}})

print(n)
[]

2:.

start = datetime(2019, 2, 2, 6, 35, 6, 764)
end = datetime(2019, 2, 20, 6, 55, 3, 381)

doc = db.collection.find({'ts': {'$gte': start, '$lt': end}})
print(doc)
[]

Однако я начинаю думать, что именно так моя дата отформатирована в ключе ts. Вот пример документа:

{
"_id": {
    "$oid": "5babf3dab512dd0165efd36c"
},
"d": [
    {
        "d": [
            17317,
            16556,
            9680,
            55982,
            45948
        ],
        "h": 74.65,
        "ts": "2018-09-26T21:02:19+00:00",
        "p": [
            61,
            76,
            137,
            152,
            122
        ],
        "si": "9829563c95d0155f",
        "t": 24.82,
        "ti": "0000000000000000"
    },
    {
        "d": [
            17821,
            17488,
            9199,
            56447,
            44089
        ],
        "h": 80.09,
        "ts": "2018-09-26T21:02:19+00:00",
        "p": [
            61,
            76,
            137,
            152,
            122
        ],
        "si": "a42fbc88a44a316f",
        "t": 25.1,
        "ti": "0000000000000000"
    }
],
"gi": "GW-P1007"}

Я что-то здесь упускаю? Это проблема форматирования?

1 Ответ

1 голос
/ 26 марта 2019

Вы можете преобразовать строку в дату и время и сравнить их следующим образом:

from datetime import datetime
from datetime import timedelta
q = list(db.collection.find())
result = []
for i in q:
    for j in i["d"]:
        time = datetime.strptime(j["ts"], "%Y-%m-%dT%X+00:00")
        end = datetime.now()
        start = end - timedelta(hours=10000)
        if time >= start and time <= end:
            result.append(i) #or append all document

Как я вижу в ваших данных, я думаю, что вы должны сделать цикл в "d" в вашем документе, но для даты конвертации и сравнения вы можете сделать это.

Вы можете преобразовать дату и время в строку и найти, как вы хотите. Сделайте это:

a = datetime.now()
now = a.strftime("%Y-%m-%dT%X+00:00")

И теперь вы можете использовать метод поиска. для запроса в массиве:

 db.collection.find( { "d": { $elemMatch: {"ts" : {'$lt':end, '$gt':start } } } )
...