Non include il campo perché non hai chiesto la restituzione del campo. La cosa che ti manca qui è usare $first
o un "accumulator"
per restituire l'elemento durante il $group
.
Inoltre, se non desideri l'indirizzo email vuoto, escludilo all'interno di $match
fase di pipeline, poiché è la cosa più efficiente da fare.
db.collection.aggregate([
{ $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
{ $group:
{
_id: { customer:"$customerID"},
email: { "$first": "$customerEmail" }
}
}
]);
Una "pipeline" restituisce solo "output" da fasi come $group
o $project
che in realtà lo chiedi. Proprio come la "pipe Unix" |
operatore, le uniche cose disponibili per la "fase successiva" sono ciò che emetti.
Questo dovrebbe essere evidente semplicemente da:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $group:
{
_id: { customer:"$customerID"}
}
}
]);
O anche:
db.collection.aggregate([
{ $match: { branch: "CO" } },
{ $project:
{
_id: { customer:"$customerID"}
}
}
]);
Che ovviamente restituisce solo il _id
valore poiché è tutto ciò che hai chiesto.
Hai accesso solo in qualsiasi fase della pipeline ai dati che sono stati "output dalla fase precedente". All'interno di un $group
questo significa solo il _id
per la chiave di raggruppamento e tutto ciò che è stato specificato "esplicitamente" utilizzando un "accumulator"
per qualsiasi altra proprietà che desideri restituire. Qualsiasi accumulatore (che è valido per una "stringa" qui) andrà bene, ma qualsiasi cosa al di fuori di _id
deve usa un "accumulator"
.
Suggerisco di dedicare del tempo a esaminare tutti gli operatori di aggregazione e cosa fanno effettivamente. C'è un esempio di utilizzo con ogni operatore