Não inclui o campo porque você não solicitou o retorno do campo. O que está faltando aqui é usar
$first
ou um "acumulador"
semelhante para retornar o elemento durante o $group
. Além disso, se você não quiser o endereço de e-mail vazio, exclua-o no
$match
estágio de pipeline, já que essa é a coisa mais eficiente a se fazer. db.collection.aggregate([
{ $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
{ $group:
{
_id: { customer:"$customerID"},
email: { "$first": "$customerEmail" }
}
}
]);
Um "pipeline" retorna apenas "saída" de estágios como
$group
ou $project
que você realmente pede. Assim como o "tubo Unix" |
operador, as únicas coisas disponíveis para o "próximo estágio" são o que você produz. Isso deve ser evidente simplesmente a partir de:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $group:
{
_id: { customer:"$customerID"}
}
}
]);
Ou ainda:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $project:
{
_id: { customer:"$customerID"}
}
}
]);
Que retorna, é claro, apenas o
_id
valor, uma vez que isso é tudo que você pediu. Você só tem acesso em qualquer estágio do pipeline aos dados que foram "saídos pelo estágio anterior". Dentro de um
$group
isso significa apenas o _id
para a chave de agrupamento e o que foi especificado "explicitamente" usando um "acumulador"
válido para quaisquer outras propriedades que você deseja devolver. Qualquer acumulador (que é válido para uma "string" aqui) servirá, mas qualquer coisa fora do _id
deve use um "acumulador"
. Sugiro reservar um tempo para analisar todos os operadores de agregação e o que eles realmente fazem. Há uso de exemplo com cada operador