Можете да направите това с помощта на .aggregate()
и предимно $unwind
оператор на тръбопровода:
В съвременния MongoDB 3.4 и по-нова версия можете да използвате в тандем с $replaceRoot
Model.aggregate([
{ "$unwind": "$books" },
{ "$replaceRoot": { "newRoot": "$books" } }
],function(err,results) {
})
В по-ранни версии указвате всички полета с $project
:
Model.aggregate([
{ "$unwind": "$books" },
{ "$project": {
"_id": "$books._id",
"pages": "$books.pages",
"title": "$books.title"
}}
],function(err,results) {
})
Така че $unwind
е това, което използвате за деконструиране или "денормализиране" на записите в масива за обработка. На практика това създава копие на целия документ за всеки член на масива.
Останалата част от задачата е за връщане "само" на тези полета, присъстващи в масива.
Това обаче не е много разумно нещо. Ако намерението ви е да върнете само съдържание, вградено в масив от документ, тогава би било по-добре да поставите това съдържание в отделна колекция.
Много по-добре е за производителност, отделяйки всички документи от колекция с рамката за агрегиране, само за да изброите тези документи само от масива.