MongoDB выполняет запросы внутри массива объектов

Я очень новичок в MongoDB и имею опыт работы с MySQL только с базами данных.

У меня есть этот документ внутри MongoDB:

{
"type": "table",
"name": "pd_locations",
"database": "boatie_db",
"data": [{
    "location_id": "1",
    "name": "Ved slusen (Sluseholmen)",
    "latitude": "12.55013600",
    "longitude": "55.64845000",
    "time_from_slus": "0"
}, {
    "location_id": "2",
    "name": "Fisketorvet",
    "latitude": "12.56373800",
    "longitude": "55.66334900",
    "time_from_slus": "30"
}, {
    "location_id": "3",
    "name": "Kayak Bar",
    "latitude": "12.58679700",
    "longitude": "55.67547700",
    "time_from_slus": "35"
}, {
    "location_id": "4",
    "name": "Reffen",
    "latitude": "12.60740800",
    "longitude": "55.69375000",
    "time_from_slus": "60"
}, {
    "location_id": "5",
    "name": "Nordhavn bassin v. sandkaj",
    "latitude": "12.59589800",
    "longitude": "55.70640400",
    "time_from_slus": "75"
}]}

Я пытаюсь, если это возможно, сделать запрос, чтобы получить только один конкретный объект по идентификатору местоположения, который уже находится внутри объекта.

Например, если я запрашиваю location_id: 1, я хочу, чтобы он возвращался:

{"location_id": "1",
"name": "Ved slusen (Sluseholmen)",
"latitude": "12.55013600",
"longitude": "55.64845000",
"time_from_slus": "0"}

и/или без удостоверения личности

{"name": "Ved slusen (Sluseholmen)",
"latitude": "12.55013600",
"longitude": "55.64845000",
"time_from_slus": "0"}

person Mindaugas Jukna    schedule 02.01.2020    source источник


Ответы (1)


Да, это возможно, используйте $elemMatch:

db.collection.find(
    {
        // query to match your on object
    },
    {
        data: {
            $elemMatch: {
                location_id: "1"
            }
        }
    }
);

РЕДАКТИРОВАТЬ:

Насколько я знаю, для дальнейших манипуляций со структурой вам придется использовать конвейер агрегации.

db.collection.aggregate([
    {
        $match: {
            // your match query
        }
    },
    {
        $project: {
            data: {
                $map: {
                    input: {$filter: {input: "$data", as: "d", cond: {$eq: ["$$d.location_id", "1"]}}},
                    as: "d",
                    in: "$$d.name"
                }
            }
        }
    }
]);
person Tom Slabbaert    schedule 02.01.2020
comment
Большое спасибо за быстрый ответ. Что делать, если мне нужно вернуть имя из определенного идентификатора? Например, если у меня есть location_id: 1, и я хочу ТОЛЬКО вернуть имя из объекта? - person Mindaugas Jukna; 02.01.2020
comment
отредактировал мой ответ, в этом случае я думаю, вам нужно использовать агрегацию. - person Tom Slabbaert; 02.01.2020