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

Samlet forespørgsel i Mongodb returnerer specifikt felt

Den første ting du gør forkert her er ikke at forstå hvordan $project er beregnet til at virke. Pipeline stadier såsom $project og $group vil kun udskrive de felter, der er "eksplicit" identificeret. Så kun de felter, du siger til output, vil være tilgængelige for de følgende pipeline-trin.

Konkret her "projicerer" du kun en del af "u"-feltet i dit dokument og du fjernede derfor de øvrige data fra at være tilgængelige. Det eneste nuværende felt her nu er "navn", som er det du "projicerede".

Måske var det virkelig din hensigt at gøre sådan noget:

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

Eller endda:

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

Det giver dig den slags output, du leder efter.

Husk, at da dette er en "pipeline", så er kun "output" fra et tidligere trin tilgængeligt til det "næste" trin. Der er ikke noget "globalt" koncept for dokumentet, da dette ikke er en deklarativ erklæring som i SQL, men en "pipeline".

Så tænk Unix-rør "|" kommando, eller på anden måde slå det op. Så falder din tankegang på plads.




  1. MongoError:kunne ikke oprette forbindelse til serveren [localhost:27017] ved første forbindelse

  2. MongoDB Beregn værdier fra to arrays, sorter og begræns

  3. ECS Fargate understøtter ikke bind-mounts

  4. Mock/Test Mongodb Database Node.js