Puedes hacer esto usando .aggregate()
y predominantemente el $unwind
operador de tubería:
En MongoDB 3.4 moderno y superior, puede usarlo junto con $replaceRoot
Model.aggregate([
{ "$unwind": "$books" },
{ "$replaceRoot": { "newRoot": "$books" } }
],function(err,results) {
})
En versiones anteriores, especifica todos los campos con $project
:
Model.aggregate([
{ "$unwind": "$books" },
{ "$project": {
"_id": "$books._id",
"pages": "$books.pages",
"title": "$books.title"
}}
],function(err,results) {
})
Así que $unwind
es lo que usa para deconstruir o "desnormalizar" las entradas de la matriz para su procesamiento. Efectivamente, esto crea una copia de todo el documento para cada miembro de la matriz.
El resto de la tarea consiste en devolver "solo" los campos presentes en la matriz.
Sin embargo, no es una cosa muy sabia. Si su intención es solo devolver contenido incrustado dentro de una matriz de un documento, entonces sería mejor colocar ese contenido en una colección separada.
Es mucho mejor para el rendimiento, separar todos los documentos de una colección con el marco de agregación, solo para enumerar esos documentos solo de la matriz.