Det inkluderer ikke feltet, fordi du ikke har bedt om at få feltet tilbage. Det, du mangler her, er at bruge $first
eller en lignende "akkumulator"
for at returnere elementet under $group
.
Hvis du ikke vil have den tomme e-mailadresse, skal du ekskludere den i $match
pipeline fase, da det er den mest effektive ting at gøre.
db.collection.aggregate([
{ $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
{ $group:
{
_id: { customer:"$customerID"},
email: { "$first": "$customerEmail" }
}
}
]);
En "pipeline" returnerer kun "output" fra stadier som $group
eller $project
at du faktisk beder det om. Ligesom "Unix-røret" |
operatør, de eneste ting, der er tilgængelige for "næste trin", er det, du udskriver.
Dette skulle blot fremgå af:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $group:
{
_id: { customer:"$customerID"}
}
}
]);
Eller endda:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $project:
{
_id: { customer:"$customerID"}
}
}
]);
Hvilket naturligvis kun returnerer _id
værdi, da det er alt, du bad om.
Du har kun adgang i et hvilket som helst pipeline-stadium til de data, som blev "outputtet af den forrige fase". Inden for en $group
det betyder kun _id
for grupperingsnøglen, og hvad der end er angivet "eksplicit" ved hjælp af en gyldig "akkumulator"
for andre ejendomme, du ønsker at returnere. Enhver akkumulator (som er gyldig for en "streng" her ) vil fungere, men alt uden for _id
skal brug en "akkumulator"
.
Jeg foreslår, at du tager dig tid til at se på alle aggregeringsoperatørerne og hvad de rent faktisk gør. Der er eksempler på brug med hver operatør