MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Inclure les champs dans l'agrégat mongodb

Il n'inclut pas le champ car vous n'avez pas demandé le retour du champ. La chose qui vous manque ici est d'utiliser $first ou un "accumulateur" similaire afin de retourner l'élément pendant le $group .

De plus, si vous ne voulez pas que l'adresse e-mail soit vide, excluez-la dans le $match l'étape du pipeline, car c'est la chose la plus efficace à faire.

db.collection.aggregate([
    { $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
    { $group:
        {
            _id: { customer:"$customerID"},
            email: { "$first": "$customerEmail" }
        }
    }
]);

Un "pipeline" ne renvoie que la "sortie" des étapes comme $group ou $project que vous lui demandez réellement. Tout comme le "tuyau Unix" | l'opérateur, les seules choses disponibles pour "l'étape suivante" sont ce que vous sortez.

Cela devrait être évident simplement à partir de :

db.collection.aggregate([
    { $match: { branch: "CO" } },   
    { $group:
        {
            _id: { customer:"$customerID"}
        }
    }
]);

Ou encore :

db.collection.aggregate([
    { $match: { branch: "CO" } },   
    { $project:
        {
            _id: { customer:"$customerID"}
        }
    }
]);

Qui ne renvoie bien sûr que le _id valeur puisque c'est tout ce que vous avez demandé.

Vous n'avez accès à n'importe quelle étape du pipeline qu'aux données qui ont été "sorties par l'étape précédente". Au sein d'un $group cela signifie uniquement le _id pour la clé de regroupement, et tout ce qui a été spécifié "explicitement" en utilisant un "accumulateur" pour toutes les autres propriétés que vous souhaitez retourner. N'importe quel accumulateur (qui est valide pour une "chaîne" ici) fera l'affaire, mais tout ce qui est en dehors de _id doit utiliser un "accumulateur" .

Je suggère de prendre le temps de regarder tous les opérateurs d'agrégation et ce qu'ils font réellement. Il y a un exemple d'utilisation avec chaque opérateur