MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Felder in mongodb-Aggregat einschließen

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