MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Die aggregierte Abfrage in Mongodb gibt ein bestimmtes Feld zurück

Das erste, was Sie hier falsch machen, ist nicht zu verstehen, wie $project soll funktionieren. Pipeline-Stufen wie $project und $group gibt nur die "explizit" identifizierten Felder aus. Daher sind nur die Felder, von denen Sie sagen, dass sie ausgegeben werden sollen, für die folgenden Pipeline-Stufen verfügbar.

Speziell hier "projizieren" Sie nur einen Teil des "u"-Feldes in Ihr Dokument und haben daher die anderen Daten von der Verfügbarkeit entfernt. Das einzige vorhandene Feld hier ist jetzt "Name", das Sie "projiziert" haben.

Vielleicht war es wirklich Ihre Absicht, so etwas zu tun:

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

Oder sogar:

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

Das gibt Ihnen die Art von Ausgabe, nach der Sie suchen.

Denken Sie daran, dass, da dies eine „Pipeline“ ist, nur die „Ausgabe“ einer vorherigen Stufe für die „nächste“ Stufe verfügbar ist. Es gibt kein "globales" Konzept des Dokuments, da es sich nicht um eine deklarative Anweisung wie in SQL handelt, sondern um eine "Pipeline".

Denken Sie also an die Unix-Pipe "|" Befehl, oder suchen Sie das anderweitig nach. Dann wird sich Ihr Denken fügen.