Você pode fazer isso usando
.aggregate()
e predominantemente o $unwind
operador de tubulação:No MongoDB 3.4 moderno e acima, você pode usar em conjunto com
$replaceRoot
Model.aggregate([
{ "$unwind": "$books" },
{ "$replaceRoot": { "newRoot": "$books" } }
],function(err,results) {
})
Nas versões anteriores, você especifica todos os campos com
$project
:Model.aggregate([
{ "$unwind": "$books" },
{ "$project": {
"_id": "$books._id",
"pages": "$books.pages",
"title": "$books.title"
}}
],function(err,results) {
})
Então
$unwind
é o que você usa para desconstruir ou "desnormalizar" as entradas da matriz para processamento. Efetivamente, isso cria uma cópia de todo o documento para cada membro da matriz. O restante da tarefa é retornar "somente" os campos presentes no array.
Não é uma coisa muito sábia de se fazer. Se sua intenção é retornar apenas o conteúdo incorporado em uma matriz de um documento, seria melhor colocar esse conteúdo em uma coleção separada.
É muito melhor para o desempenho, separando todos os documentos de uma coleção com a estrutura de agregação, apenas para listar esses documentos apenas da matriz.