MongoDB menanyakan di dalam array objek

Saya sangat baru di MongoDB, dan hanya memiliki pengalaman di MySQL dengan database.

Saya memiliki dokumen ini di dalam 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"
}]}

Saya mencoba, jika memungkinkan, menanyakan jadi saya hanya mendapatkan satu objek tertentu berdasarkan id lokasi, yang sudah ada di dalam objek.

Misalnya, jika saya meminta location_id: 1, saya ingin mengembalikannya:

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

dan/atau tanpa tanda pengenal

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

person Mindaugas Jukna    schedule 02.01.2020    source sumber


Jawaban (1)


Ya, bisa, gunakan $elemMatch:

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

Sunting:

Untuk manipulasi struktur lebih lanjut, Anda harus menggunakan pipa agregasi sejauh yang saya tahu.

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
Terima kasih banyak atas jawaban cepat Anda. Bagaimana jika saya perlu mengembalikan nama dari id tertentu? Seperti jika saya memiliki location_id: 1, dan saya HANYA ingin mengembalikan nama dari objek tersebut? - person Mindaugas Jukna; 02.01.2020
comment
mengedit jawaban saya, untuk itu saya pikir Anda harus menggunakan agregasi. - person Tom Slabbaert; 02.01.2020