Het bevat het veld niet omdat u niet hebt gevraagd om het veld terug te sturen. Wat je hier mist is het gebruik van $first
of een vergelijkbare "accumulator"
om het element te retourneren tijdens de $group
.
Als u het lege e-mailadres niet wilt, sluit het dan uit binnen de $match
pijplijnfase, aangezien dat het meest efficiënt is om te doen.
db.collection.aggregate([
{ $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
{ $group:
{
_id: { customer:"$customerID"},
email: { "$first": "$customerEmail" }
}
}
]);
Een "pijplijn" retourneert alleen "uitvoer" van fasen zoals $group
of $project
dat je er eigenlijk om vraagt. Net als de "Unix-pipe" |
operator, de enige dingen die beschikbaar zijn voor de "volgende fase" zijn wat u uitvoert.
Dit zou eenvoudigweg moeten blijken uit:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $group:
{
_id: { customer:"$customerID"}
}
}
]);
Of zelfs:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $project:
{
_id: { customer:"$customerID"}
}
}
]);
Wat natuurlijk alleen de _id
. oplevert waarde, want dat is alles waar je om vroeg.
U hebt in elke pijplijnfase alleen toegang tot de gegevens die zijn "uitgevoerd door de vorige fase". Binnen een $group
dat betekent alleen de _id
voor de groeperingssleutel en alles wat "expliciet" is opgegeven met een geldige "accumulator"
voor alle andere eigendommen die u wilt retourneren. Elke accumulator (die hier geldig is voor een "string") is voldoende, maar alles buiten de _id
moeten gebruik een "accumulator"
.
Ik raad aan de tijd te nemen om alle aggregatie-operators te bekijken en wat ze eigenlijk doen. Er is een voorbeeldgebruik bij elke operator