MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Consulta agregada no Mongodb retorna campo específico


A primeira coisa que você está fazendo de errado aqui é não entender como $project se destina a funcionar. Etapas do pipeline, como $project e $group só produzirá os campos que são "explicitamente" identificados. Portanto, apenas os campos que você disser para saída estarão disponíveis para os seguintes estágios do pipeline.

Especificamente aqui você "projeta" apenas parte do campo "u" em seu documento e, portanto, removeu os outros dados de estarem disponíveis. O único campo presente aqui agora é "nome", que é aquele que você "projetou".

Talvez fosse realmente sua intenção fazer algo assim:
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 ainda:
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 }
])

Isso lhe dá o tipo de saída que você está procurando.

Lembre-se que como este é um "pipeline", então apenas a "saída" de um estágio anterior estará disponível para o estágio "próximo". Não existe um conceito "global" do documento, pois esta não é uma declaração declarativa como no SQL, mas um "pipeline".

Então pense no tubo Unix "|" comando, ou procure isso. Então seu pensamento vai se encaixar.