MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Includi i campi nell'aggregato mongodb

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