Có một số cách tiếp cận để giải quyết vấn đề này, nhưng nó phụ thuộc phần lớn vào phiên bản MongoDB của bạn. Các phiên bản gần đây hơn từ 2.6 trở lên hỗ trợ $ bản đồ
toán tử mà bạn có thể sử dụng trong $ project
để làm những gì bạn muốn:
db.friend.aggregate([
{ "$project": {
"name": 1,
"buddies": {
"$map": {
"input": "$friends",
"as": "el",
"in": {
"nickName": "$$el.name",
"age": "$$el.age"
}
}
}
}}
])
Trong các phiên bản trước, bạn sẽ sử dụng $ unwind
để làm việc với các phần tử của mảng và xây dựng lại qua $ nhóm
:
db.collection.aggregate([
{ "$unwind": "$friends" },
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"buddies": {
"$push": {
"nickName": "$friends.name",
"age": "$friends.age"
}
}
}}
])
Với biểu mẫu đầu tiên hiệu quả hơn một chút vì bạn không khử chuẩn hóa nội dung mảng và tạo ra nhiều tài liệu hơn trong quá trình xử lý.