Das Feld ist nicht enthalten, da Sie nicht angefordert haben, dass das Feld zurückgegeben wird. Was Sie hier vermissen, ist die Verwendung von $first
oder ein ähnlicher "Akkumulator"
um das Element während des $group
.
Wenn Sie die leere E-Mail-Adresse nicht möchten, schließen Sie sie innerhalb von aus $match
Pipeline-Phase, da dies am effizientesten ist.
db.collection.aggregate([
{ $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
{ $group:
{
_id: { customer:"$customerID"},
email: { "$first": "$customerEmail" }
}
}
]);
Eine „Pipeline“ gibt nur „Ausgabe“ von Stufen wie $ zurück Gruppe
oder $project
dass Sie es wirklich verlangen. Genau wie die "Unix-Pipe" |
Operator sind die einzigen Dinge, die für die "nächste Stufe" verfügbar sind, was Sie ausgeben.
Dies sollte einfach ersichtlich sein aus:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $group:
{
_id: { customer:"$customerID"}
}
}
]);
Oder sogar:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $project:
{
_id: { customer:"$customerID"}
}
}
]);
Was natürlich nur die _id
zurückgibt Wert, denn das ist alles, wonach Sie gefragt haben.
Sie haben in jeder Pipelinestufe nur Zugriff auf die Daten, die „von der vorherigen Stufe ausgegeben“ wurden. Innerhalb einer $group
das bedeutet nur die _id
für den Gruppierungsschlüssel und was auch immer "explizit" angegeben wurde unter Verwendung eines gültigen "Akkumulator"
für alle anderen Eigenschaften, die Sie zurückgeben möchten. Jeder Akkumulator (der hier für einen "String" gültig ist) tut es, aber alles außerhalb der _id
müssen Verwenden Sie einen "Akkumulator"
.
Ich schlage vor, sich die Zeit zu nehmen, sich alle Aggregationsoperatoren anzusehen und was sie eigentlich tun. Für jeden Operator
gibt es eine Beispielverwendung