sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo devolver solo los documentos anidados de una matriz de todos los documentos

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.