MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come restituire solo i documenti annidati di un array da tutti i documenti

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.