Puoi farlo usando .aggregate()
e principalmente il $unwind
operatore della pipeline:
Nel moderno MongoDB 3.4 e versioni successive puoi utilizzare in tandem con $replaceRoot
Model.aggregate([
{ "$unwind": "$books" },
{ "$replaceRoot": { "newRoot": "$books" } }
],function(err,results) {
})
Nelle versioni precedenti si specificano tutti i campi con $project
:
Model.aggregate([
{ "$unwind": "$books" },
{ "$project": {
"_id": "$books._id",
"pages": "$books.pages",
"title": "$books.title"
}}
],function(err,results) {
})
Quindi $unwind
è ciò che usi per decostruire o "denormalizzare" le voci dell'array per l'elaborazione. In effetti, questo crea una copia dell'intero documento per ogni membro dell'array.
Il resto dell'attività riguarda la restituzione "solo" di quei campi presenti nell'array.
Non è una cosa molto saggia da fare però. Se il tuo intento è quello di restituire solo il contenuto incorporato all'interno di una matrice di un documento, allora è meglio mettere quel contenuto in una raccolta separata.
È molto meglio per le prestazioni, separare tutti i documenti da una raccolta con il framework di aggregazione, solo per elencare quei documenti solo dall'array.