MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment renvoyer uniquement les documents imbriqués d'un tableau à partir de tous les documents

Vous pouvez le faire en utilisant .aggregate() et principalement le $unwind opérateur de pipeline :

Dans MongoDB 3.4 moderne et supérieur, vous pouvez utiliser en tandem avec $replaceRoot

Model.aggregate([
  { "$unwind": "$books" },
  { "$replaceRoot": { "newRoot": "$books" } }
],function(err,results) {

})

Dans les versions antérieures, vous spécifiiez tous les champs avec $project :

Model.aggregate([
  { "$unwind": "$books" },
  { "$project": {
    "_id": "$books._id",
    "pages": "$books.pages",
    "title": "$books.title"
  }}
],function(err,results) {

})

Alors $unwind est ce que vous utilisez pour déconstruire ou "dénormaliser" les entrées du tableau pour le traitement. En fait, cela crée une copie de l'ensemble du document pour chaque membre du tableau.

Le reste de la tâche consiste à renvoyer "uniquement" les champs présents dans le tableau.

Ce n'est pas une chose très sage à faire cependant. Si votre intention est de ne renvoyer que le contenu intégré dans un tableau d'un document, vous feriez mieux de placer ce contenu dans une collection distincte à la place.

C'est bien mieux pour les performances, séparer tous les documents d'une collection avec le cadre d'agrégation, juste pour lister uniquement ces documents du tableau.