Du kan gøre dette ved at bruge .aggregate()
og overvejende $unwind
rørledningsoperatør:
I moderne MongoDB 3.4 og nyere kan du bruge sammen med $replaceRoot
Model.aggregate([
{ "$unwind": "$books" },
{ "$replaceRoot": { "newRoot": "$books" } }
],function(err,results) {
})
I tidligere versioner angiver du alle felter med $project
:
Model.aggregate([
{ "$unwind": "$books" },
{ "$project": {
"_id": "$books._id",
"pages": "$books.pages",
"title": "$books.title"
}}
],function(err,results) {
})
Så $unwind
er det, du bruger til at dekonstruere eller "denormalisere" array-indgange til behandling. Dette skaber effektivt en kopi af hele dokumentet for hvert medlem af arrayet.
Resten af opgaven handler om at returnere "kun" de felter, der er til stede i arrayet.
Det er dog ikke særlig klogt at gøre. Hvis din hensigt kun er at returnere indhold, der er indlejret i en række af et dokument, ville du være bedre stillet at lægge dette indhold i en separat samling i stedet.
Det er langt bedre for ydeevnen, at skille alle dokumenter fra en samling fra hinanden med aggregeringsrammerne, bare for kun at vise disse dokumenter fra arrayet.