Nie obejmuje pola, ponieważ nie prosiłeś o zwrot pola. To, czego tutaj brakuje, to użycie $first
lub podobny "akumulator"
w celu zwrócenia elementu podczas $group
.
Ponadto, jeśli nie chcesz pustego adresu e-mail, wyklucz go w $match
etap potoku, ponieważ jest to najbardziej wydajna rzecz do zrobienia.
db.collection.aggregate([
{ $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
{ $group:
{
_id: { customer:"$customerID"},
email: { "$first": "$customerEmail" }
}
}
]);
„Potok” zwraca tylko „wyjście” z etapów, takich jak $group
lub $project
że faktycznie o to prosisz. Podobnie jak „potok uniksowy” |
operator, jedyne rzeczy dostępne na "następnym etapie" to to, co wyprowadzasz.
Powinno to wynikać po prostu z:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $group:
{
_id: { customer:"$customerID"}
}
}
]);
Lub nawet:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $project:
{
_id: { customer:"$customerID"}
}
}
]);
Który zwraca oczywiście tylko _id
wartość, ponieważ to wszystko, o co prosiłeś.
Na dowolnym etapie potoku masz dostęp tylko do danych, które zostały „wydane na poprzednim etapie”. W $group
oznacza to tylko _id
dla klucza grupującego i tego, co zostało określone „wprost” używając prawidłowego "akumulatora"
za wszelkie inne nieruchomości, które chcesz zwrócić. Dowolny akumulator (który jest poprawny dla "ciągu" tutaj) zrobi, ale wszystko poza _id
musi użyj "akumulatora"
.
Proponuję poświęcić trochę czasu na przyjrzenie się wszystkim operatorom agregacji i co właściwie robią. Istnieje przykładowe użycie z każdym operatorem