sql >> Base de Datos >  >> NoSQL >> MongoDB

La consulta agregada en Mongodb devuelve un campo específico

Lo primero que está haciendo mal aquí es no entender cómo $project está destinado a trabajar. Etapas de canalización como $project y $group solo generará los campos que están identificados "explícitamente". Por lo tanto, solo los campos que indique que se generen estarán disponibles para las siguientes etapas de canalización.

Específicamente, aquí "proyecta" solo una parte del campo "u" en su documento y, por lo tanto, eliminó los otros datos para que no estuvieran disponibles. El único campo presente aquí ahora es "nombre", que es el que "proyectó".

Quizás era realmente tu intención hacer algo como esto:

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 incluso:

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

Eso le da el tipo de salida que está buscando.

Recuerde que como se trata de una "tubería", solo la "salida" de una etapa anterior está disponible para la etapa "siguiente". No hay un concepto "global" del documento ya que no es una declaración declarativa como en SQL, sino una "tubería".

Así que piensa en la tubería Unix "|" comando, o busque eso de otra manera. Entonces tu pensamiento encajará en su lugar.