MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So geben Sie nur die verschachtelten Dokumente eines Arrays aus allen Dokumenten zurück

Sie können dies mit .aggregate() tun und vor allem das $unwind Pipeline-Betreiber:

In der modernen MongoDB 3.4 und höher können Sie zusammen mit $replaceRoot verwenden

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

})

In früheren Versionen spezifizieren Sie alle Felder mit $project :

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

})

Also $unwind verwenden Sie, um die Array-Einträge für die Verarbeitung zu dekonstruieren oder zu "denormalisieren". Dadurch wird effektiv eine Kopie des gesamten Dokuments für jedes Mitglied des Arrays erstellt.

Der Rest der Aufgabe besteht darin, "nur" die im Array vorhandenen Felder zurückzugeben.

Es ist jedoch nicht sehr klug, dies zu tun. Wenn Sie nur Inhalte zurückgeben möchten, die in ein Array eines Dokuments eingebettet sind, sollten Sie diese Inhalte stattdessen besser in einer separaten Sammlung ablegen.

Es ist viel besser für die Leistung, alle Dokumente aus einer Sammlung mit dem Aggregations-Framework auseinanderzuziehen, um nur diese Dokumente aus dem Array aufzulisten.