Nó không bao gồm trường vì bạn đã không yêu cầu trả lại trường. Điều bạn còn thiếu ở đây là sử dụng $first
hoặc "bộ tích lũy"
tương tự để trả về phần tử trong $group
.
Ngoài ra, nếu bạn không muốn địa chỉ email trống thì hãy loại trừ nó trong $match
giai đoạn đường ống, vì đó là điều hiệu quả nhất cần làm.
db.collection.aggregate([
{ $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
{ $group:
{
_id: { customer:"$customerID"},
email: { "$first": "$customerEmail" }
}
}
]);
"Đường ống" chỉ trả về "đầu ra" từ các giai đoạn như $group
hoặc $project
mà bạn thực sự yêu cầu nó. Cũng giống như "Unix pipe" |
, những thứ duy nhất có sẵn cho "giai đoạn tiếp theo" là những gì bạn xuất ra.
Điều này sẽ được hiển nhiên đơn giản từ:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $group:
{
_id: { customer:"$customerID"}
}
}
]);
Hoặc thậm chí:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $project:
{
_id: { customer:"$customerID"}
}
}
]);
Tất nhiên chỉ trả về _id
giá trị vì đó là tất cả những gì bạn yêu cầu.
Bạn chỉ có quyền truy cập trong bất kỳ giai đoạn đường ống nào vào dữ liệu được "xuất bởi giai đoạn trước". Trong một $group
điều đó có nghĩa là chỉ _id
cho khóa nhóm và bất kỳ điều gì được chỉ định "rõ ràng" sử dụng "bộ tích lũy"
hợp lệ cho bất kỳ tài sản nào khác mà bạn muốn trả lại. Bất kỳ bộ tích lũy nào (hợp lệ cho một "chuỗi" ở đây) sẽ làm được, nhưng bất kỳ điều gì bên ngoài _id
phải sử dụng "bộ tích lũy"
.
Tôi khuyên bạn nên dành thời gian xem xét tất cả toán tử tổng hợp và những gì họ thực sự làm. Có cách sử dụng ví dụ với từng toán tử