Il n'inclut pas le champ car vous n'avez pas demandé le retour du champ. La chose qui vous manque ici est d'utiliser $first
ou un "accumulateur"
similaire afin de retourner l'élément pendant le $group
.
De plus, si vous ne voulez pas que l'adresse e-mail soit vide, excluez-la dans le $match
l'étape du pipeline, car c'est la chose la plus efficace à faire.
db.collection.aggregate([
{ $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
{ $group:
{
_id: { customer:"$customerID"},
email: { "$first": "$customerEmail" }
}
}
]);
Un "pipeline" ne renvoie que la "sortie" des étapes comme $group
ou $project
que vous lui demandez réellement. Tout comme le "tuyau Unix" |
l'opérateur, les seules choses disponibles pour "l'étape suivante" sont ce que vous sortez.
Cela devrait être évident simplement à partir de :
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $group:
{
_id: { customer:"$customerID"}
}
}
]);
Ou encore :
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $project:
{
_id: { customer:"$customerID"}
}
}
]);
Qui ne renvoie bien sûr que le _id
valeur puisque c'est tout ce que vous avez demandé.
Vous n'avez accès à n'importe quelle étape du pipeline qu'aux données qui ont été "sorties par l'étape précédente". Au sein d'un $group
cela signifie uniquement le _id
pour la clé de regroupement, et tout ce qui a été spécifié "explicitement" en utilisant un "accumulateur"
pour toutes les autres propriétés que vous souhaitez retourner. N'importe quel accumulateur (qui est valide pour une "chaîne" ici) fera l'affaire, mais tout ce qui est en dehors de _id
doit utiliser un "accumulateur"
.
Je suggère de prendre le temps de regarder tous les opérateurs d'agrégation et ce qu'ils font réellement. Il y a un exemple d'utilisation avec chaque opérateur