sql >> Databáze >  >> NoSQL >> MongoDB

Aggregate Query v Mongodb vrací konkrétní pole

První věc, kterou zde děláte špatně, je, že nerozumíte tomu, jak $project je určen k práci. Fáze potrubí, jako je $project a $group vypíše pouze pole, která jsou "explicitně" identifikována. Takže pouze pole, která vyjádříte jako výstup, budou dostupná pro následující fáze kanálu.

Konkrétně zde "promítnete" pouze část pole "u" ve vašem dokumentu a tím jste odstranili ostatní data z dostupnosti. Jediným přítomným polem je nyní „jméno“, což je to, které jste „promítli“.

Možná to byl váš záměr udělat něco takového:

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

Nebo dokonce:

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

To vám dává druh výstupu, který hledáte.

Pamatujte, že jelikož se jedná o „potrubí“, do „následující“ fáze je k dispozici pouze „výstup“ z předchozí fáze. Neexistuje žádný „globální“ koncept dokumentu, protože se nejedná o deklarativní příkaz jako v SQL, ale o „potrubí“.

Takže si představte unixové potrubí "|" příkaz, nebo si to jinak vyhledejte. Pak vaše myšlení zapadne na místo.




  1. Jak používat proměnné ve funkci MongoDB Map-reduce map

  2. odinstalujte ovladač mongodb php a nainstalujte jinou verzi

  3. Jak použít stejné pole vícekrát v MongoDB najít dotaz v NodeJS

  4. Nasazení a údržba MongoDB pomocí Ansible