Исходя из использования в основном 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}})