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

Zahrnout pole do agregátu mongodb

Nezahrnuje pole, protože jste nepožádali o vrácení pole. To, co vám zde chybí, je použití $first nebo podobný "accumulator" za účelem vrácení prvku během $group .

Pokud také nechcete prázdnou e-mailovou adresu, vylučte ji v rámci $match fáze potrubí, protože to je nejúčinnější věc.

db.collection.aggregate([
    { $match: { branch: "CO", "customerEmail": { "$ne": "" } } },
    { $group:
        {
            _id: { customer:"$customerID"},
            email: { "$first": "$customerEmail" }
        }
    }
]);

"Potrubí" vrací "výstup" pouze z fází jako $group nebo $project že o to vlastně žádáš. Stejně jako "Unixová roura" | operátora, jediné věci dostupné pro "další fázi" jsou to, co vytisknete.

To by mělo být zřejmé jednoduše z:

db.collection.aggregate([
    { $match: { branch: "CO" } },   
    { $group:
        {
            _id: { customer:"$customerID"}
        }
    }
]);

Nebo dokonce:

db.collection.aggregate([
    { $match: { branch: "CO" } },   
    { $project:
        {
            _id: { customer:"$customerID"}
        }
    }
]);

Což samozřejmě vrací pouze _id hodnotu, protože to je vše, co jste požadovali.

V jakékoli fázi potrubí máte přístup pouze k datům, která byla „výstupem předchozí fáze“. V rámci $group to znamená pouze _id pro klíč seskupení a vše, co bylo uvedeno "explicitně" pomocí platného "accumulator" pro jakékoli další nemovitosti, které chcete vrátit. Bude stačit jakýkoli akumulátor (který zde platí pro "řetězec"), ale cokoliv mimo _id musí použijte "akumulátor" .

Navrhuji, abyste si udělali čas a podívali se na všechny operátory agregace a co vlastně dělají. U každého operátora existuje příklad použití




  1. MongoDB:Je možné omezit výsledky $lookup na určitá pole (jako projekci)?

  2. Jak odstranit mnoho dokumentů v dělené kolekci v Azure CosmosDB pomocí MongoDB API

  3. mongodb výkon čtení/zápisu a mongo hosting v cloudu

  4. Jak přesunout položku v poli MongoDB?