Bạn có thể thực hiện việc này bằng cách sử dụng .aggregate()
và chủ yếu là $unwind
nhà điều hành đường ống:
Trong MongoDB hiện đại 3.4 trở lên, bạn có thể sử dụng song song với $replaceRoot
Model.aggregate([
{ "$unwind": "$books" },
{ "$replaceRoot": { "newRoot": "$books" } }
],function(err,results) {
})
Trong các phiên bản trước đó, bạn chỉ định tất cả các trường bằng $project
:
Model.aggregate([
{ "$unwind": "$books" },
{ "$project": {
"_id": "$books._id",
"pages": "$books.pages",
"title": "$books.title"
}}
],function(err,results) {
})
Vì vậy, $unwind
là những gì bạn sử dụng để giải cấu trúc hoặc "không chuẩn hóa" các mục nhập mảng để xử lý. Hiệu quả, điều này tạo ra một bản sao của toàn bộ tài liệu cho mỗi thành viên của mảng.
Phần còn lại của nhiệm vụ là trả về "chỉ" những trường có trong mảng.
Đó không phải là một điều rất khôn ngoan để làm mặc dù vậy. Nếu mục đích của bạn là chỉ trả lại nội dung được nhúng trong một mảng của tài liệu, thì tốt hơn hết bạn nên đặt nội dung đó vào một bộ sưu tập riêng.
Nó tốt hơn nhiều cho hiệu suất, tách tất cả các tài liệu từ một bộ sưu tập bằng khung tổng hợp, chỉ để liệt kê các tài liệu đó từ mảng mà thôi.