MongoDB присоединяется по ближайшей отметке времени - PullRequest
0 голосов
/ 20 февраля 2019

Исходя из использования в основном PostgreSQL, я новичок в MongoDB, и у меня возникают проблемы при построении сложных запросов в требуемом формате JSON (где в SQL я бы использовал CTE).Приведу упрощенный пример - есть ряд автомобилей с собственным уникальным идентификатором vin.Автомобили пингуются, когда они зарезервированы, и , когда они не зарезервированы.

У меня есть число Объектов в моей коллекции engine, которые структурированы следующим образом:

{
    "_id" : ObjectId("1"),
    "vin" : "12345",
    "class_name" : "foo",
    "decoded_payload" : {
        "timestamp" : 1547329250,
        "status" : "LOCKED"
    }
}
{
    "_id" : ObjectId("2"),
    "vin" : "12345",
    "class_name" : "foo",
    "decoded_payload" : {
        "timestamp" : 1547329260,
        "status" : "LOCKED"
    }
}
{
    "_id" : ObjectId("3"),
    "vin" : "12345",
    "class_name" : "bar",
    "decoded_payload" : {
        "timestamp" : 1547329270,
        "status" : "UNLOCKED",
        "reservation_id" : "71"

    }
}
{
    "_id" : ObjectId("4"),
    "vin" : "12345",
    "class_name" : "baz",
    "decoded_payload" : {
        "timestamp" : 1547329280,
        "status" : "UNLOCKED",
        "reservation_id" : "71"

    }
}    
{
    "_id" : ObjectId("5"),
    "vin" : "12345",
    "class_name" : "foo",
    "decoded_payload" : {
        "timestamp" : 1547329290,
        "status" : "NO SIGNAL"

    }
}
{
    "_id" : ObjectId("6"),
    "vin" : "12345",
    "class_name" : "foo",
    "decoded_payload" : {
        "timestamp" : 1547329300,
        "status" : "LOCKED"

    }
}

Записи, созданные вне резервирования, всегда относятся к классу foo (эти во время резервирование может меняться, но никогда не будет foo)

Меня интересует только получение status непосредственно перед и сразу после каждого резервирования на каждом vin.Это можно получить, взяв ближайшую запись класса foo на минимальные временные метки для reservation_id и vin, поскольку моя цель - получить все статусы до / после для каждого reservation_id, сделанного для каждого vin

Вывод для вышеприведенного примера будет выглядеть примерно так:

{"vin": "1234", "reservation_id": "71", "pre_status": "LOCKED", "post_status": "NO SIGNAL"}

Возможно два резервирования, чтобы быть спиной друг к другу - в которых нет "Класс foo между бронированиями на один vin - эти случаи я бы хотел полностью игнорировать.

Пока у меня есть это, чтобы получить сами оговорки, но я был бы признателен за любые рекомендации о том, как действовать дальше - будет ли уместным заявление forEach в приведенном выше случае?

db.getCollection('engine').find({"decoded_payload.reservation_id": {$exists: true}})
...