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

La query aggregata in Mongodb restituisce un campo specifico

La prima cosa che stai sbagliando qui è non capire come $project è destinato a funzionare. Fasi della pipeline come $project e $group produrrà solo i campi che sono identificati "esplicitamente". Quindi solo i campi che dici di output saranno disponibili per le seguenti fasi della pipeline.

Nello specifico qui "proietti" solo una parte del campo "u" del tuo documento e quindi hai rimosso dalla disponibilità gli altri dati. L'unico campo presente qui ora è "nome", che è quello che hai "proiettato".

Forse era davvero tua intenzione fare qualcosa del genere:

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 }
])

O anche:

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 }
])

Questo ti dà il tipo di output che stai cercando.

Ricorda che poiché si tratta di una "pipeline", solo l'"output" da una fase precedente è disponibile per la fase "successiva". Non esiste un concetto "globale" del documento in quanto non si tratta di una dichiarazione dichiarativa come in SQL, ma di una "pipeline".

Quindi pensa alla pipe Unix "|" comando, o altrimenti cercalo. Allora il tuo pensiero andrà a posto.