Det inkluderar inte fältet eftersom du inte har bett om att fältet ska returneras. Det du saknar här är att använda $first
eller en liknande "ackumulator"
för att returnera elementet under $group
.
Om du inte vill ha den tomma e-postadressen, uteslut den i $match
pipeline, eftersom det är det mest effektiva att göra.
db.collection.aggregate([
{ $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
{ $group:
{
_id: { customer:"$customerID"},
email: { "$first": "$customerEmail" }
}
}
]);
En "pipeline" returnerar bara "output" från steg som $group
eller $project
som du faktiskt ber om det. Precis som "Unix-röret" |
operatör, de enda sakerna som är tillgängliga för "nästa steg" är vad du matar ut.
Detta bör helt enkelt framgå av:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $group:
{
_id: { customer:"$customerID"}
}
}
]);
Eller till och med:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $project:
{
_id: { customer:"$customerID"}
}
}
]);
Vilket naturligtvis bara returnerar _id
värde eftersom det är allt du bad om.
Du har bara tillgång till de data som "matades ut av föregående steg" i alla pipeline-steg. Inom en $group
det betyder bara _id
för grupperingsnyckeln och vad som än har angetts "explicit" med en giltig "ackumulator"
för alla andra fastigheter du vill returnera. Alla ackumulatorer (som är giltiga för en "sträng" här ) fungerar, men allt utanför _id
måste använd en "ackumulator"
.
Jag föreslår att du tar dig tid att titta på alla aggregationsoperatorer och vad de faktiskt gör. Det finns exempel på användning med varje operatör