Du kan göra detta med .aggregate()
och främst $unwind
pipeline-operatör:
I modern MongoDB 3.4 och senare kan du använda tillsammans med $replaceRoot
Model.aggregate([
{ "$unwind": "$books" },
{ "$replaceRoot": { "newRoot": "$books" } }
],function(err,results) {
})
I tidigare versioner specificerar du alla fält med $project
:
Model.aggregate([
{ "$unwind": "$books" },
{ "$project": {
"_id": "$books._id",
"pages": "$books.pages",
"title": "$books.title"
}}
],function(err,results) {
})
Så $unwind
är vad du använder för att dekonstruera eller "denormalisera" arrayposterna för bearbetning. Detta skapar faktiskt en kopia av hela dokumentet för varje medlem i arrayen.
Resten av uppgiften handlar om att returnera "bara" de fält som finns i arrayen.
Det är dock inte särskilt klokt att göra. Om din avsikt är att bara returnera innehåll som är inbäddat i en uppsättning av ett dokument, är det bättre att du lägger det innehållet i en separat samling istället.
Det är mycket bättre för prestanda, att dra isär alla dokument från en samling med aggregeringsramverket, bara för att bara lista dessa dokument från arrayen.