Để đạt được nhu cầu của bạn với khung tổng hợp, giai đoạn đầu tiên sẽ là $match
thao tác trên hành khách được đề cập khớp với tài liệu với người dùng trong mảng hành khách, tiếp theo là $unwind
hoạt động giải cấu trúc mảng hành khách từ các tài liệu đầu vào trong hoạt động trước đó để xuất ra một tài liệu cho mỗi phần tử. Một $match
khác hoạt động trên mảng đã giải cấu trúc sẽ tiếp tục lọc dòng tài liệu trước đó để chỉ cho phép các tài liệu phù hợp chuyển chưa được sửa đổi vào giai đoạn đường ống tiếp theo, đang chiếu các trường bắt buộc với $project
nhà điều hành. Về cơ bản, quy trình tổng hợp của bạn cho user3
sẽ như thế nào:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
Kết quả :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
CẬP NHẬT :
Để nhóm các bản sao trên các trình điều khiển có các ngày khác nhau, như bạn đã đề cập, bạn có thể thực hiện $group
hoạt động ngay trước $project
cuối cùng giai đoạn đường ống trong đó bạn tính tổng số lần hành khách bằng cách sử dụng $sum
nhà điều hành:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$group": {
"_id": "$driver",
"total": {
"$sum": "$passengers.times"
}
}
},
{
"$project": {
"_id": 0,
"driver": "$_id",
"total": 1
}
}
])
Kết quả :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}