Найдите документ, затем получите все связанные документы - PullRequest
1 голос
/ 28 мая 2020

У меня есть этот документ mongodb:

{
    "_id" : ObjectId("5e382d27bb4bd5ce3ef5fb1d"),
    "code" : "25116",
    "datecrea" : "2015-11-14 18:23:24",
    "datemodif" : "2015-11-14 18:23:24",
    "datas" : {
        "songId" : 25116,
        "artistId" : 128,
        "albumId" : 1822,
        "name" : "Free Me",
        "songTrack" : 10,
        "genres" : [ 
            "24"
        ],
    }
}

Я хочу сделать запрос, который ищет песню по ее жанру, который является array жанрами, а затем получить мне artist и album, относящийся к этой песне, на основе полей datas.artistId и datas.albumId.

Я пробовал этот запрос:

db.getCollection('songs').aggregate([
{ $elemMatch: { "datas.genre": 31 } },
{ $lookup: { from: "artists", localField: "datas.artisId", foreignField: "code", as: "artist" } },
{ $unwind: "$artist"}
])

Но он возвращает ошибку, зная, что я полностью новость для mongodb. Спасибо всем за помощь

1 Ответ

1 голос
/ 28 мая 2020

Вы не за горами. У вас просто две незначительные синтаксические ошибки.

  1. The $ elemMatch , не вдаваясь в подробности. $elemMatch не является этапом конвейера и не может использоваться в операции aggregate. он обычно используется в запросе find .

  2. В поиске вы написали datas.artisId вместо datas.artistId

Итак, измените свой конвейер на это:


db.getCollection('songs').aggregate([
    { $match: { "datas.genre": 31 } },
    { $lookup: { from: "artists", localField: "datas.artistId", foreignField: "code", as: "artist" } },
    { $unwind: "$artist"}
])

Еще один забавный факт, не связанный с реальным кодом, слово data уже находится во множественном числе. следовательно, datas - грамматическая ошибка. И в случае, если вам интересно, форма единственного числа data - datum.

...