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.