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

La requête agrégée dans Mongodb renvoie un champ spécifique

La première chose que vous faites mal ici est de ne pas comprendre comment $project est destiné à fonctionner. Étapes de pipeline telles que $project et $group ne sortira que les champs qui sont "explicitement" identifiés. Ainsi, seuls les champs que vous indiquez en sortie seront disponibles pour les étapes de pipeline suivantes.

Concrètement ici vous ne "projetez" qu'une partie du champ "u" dans votre document et vous avez donc supprimé les autres données d'être disponibles. Le seul champ présent ici est "nom", qui est celui que vous avez "projeté".

C'était peut-être vraiment votre intention de faire quelque chose comme ça :

db.collectiontmp.aggregate([
    { "$group": {
        "_id": {
           "_id": "$u._id",
           "email": { "$toUpper": "$u.e" }
        },
        "total": { "$sum": 1 },
    }},
    { "$project": {
        "_id": 0,
        "email": "$_id.email",
        "total": 1
    }},
    { "$sort": { "total": -1 } },
    { "$limit": 10 }
])

Ou encore :

db.collectiontmp.aggregate([
    { "$group": {
        "_id": "$u._id",
        "email": { "$first": { "$toUpper": "$u.e" } }
        "total": { "$sum": 1 },
    }},
    { "$project": {
        "_id": 0,
        "email": 1,
        "total": 1
    }},
    { "$sort": { "total": -1 } },
    { "$limit": 10 }
])

Cela vous donne le type de sortie que vous recherchez.

N'oubliez pas que, comme il s'agit d'un "pipeline", seule la "sortie" d'une étape précédente est disponible pour l'étape "suivante". Il n'y a pas de concept "global" du document car il ne s'agit pas d'une instruction déclarative comme en SQL, mais d'un "pipeline".

Pensez donc au tube Unix "|" commande, ou autrement rechercher cela. Ensuite, votre réflexion se mettra en place.