MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como retornar apenas os documentos aninhados de uma matriz de todos os documentos


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.