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

Jak získat zpět původní dokument po agregaci

Spadá do kategorie hloupých agregačních triků je malá technika, která je často přehlížena.

Dotaz, který to všechno dělá, se seskupuje kolem dokumentu _id, který je jedinečným identifikátorem tohoto dokumentu. Hlavním bodem k zamyšlení je tedy celý dokument je již ve skutečnosti jedinečný identifikátor. Takže místo pouhého uložení do klíče _id použijte celý dokument.

    {$project: { 
        _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
    },

Tam, kde se to provede, vše, co je srolováno pomocí _id, zachová dokument v původní podobě. Na konci všech ostatních fází agregace vydejte konečný $project za účelem obnovení skutečné původní podoby dokumentu:

    {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}

Pak budete mít filtrované výsledky, které chcete. Tato technika může být velmi užitečná při použití s ​​pokročilým filtrováním, jako je tomu v případě tohoto dotazu, protože odstraňuje potřebu vydávat další nález na všechny výsledky.

Také v takovém případě, kdy víte, že hledáte pouze sadu výsledků, které budou odpovídat určité sadě podmínek, použijte $match operátora jako první fázi agregačního potrubí. To je nejen užitečné při zmenšení velikosti pracovní sady, ale je to také jediné fázi, ve které můžete používat index a kde můžete výrazně zvýšit výkon dotazů.

Celý proces společně:

db.forms.aggregate([
    {$match: { "forms.status": "closed" } },
    {$project: { 
        _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
    },
    {$unwind: "$forms"},
    {$group: { _id: "$_id", status: {$addToSet: "$forms.status"}}},
    {$unwind: "$status"},
    {$sort: { _id: 1, status: -1} },
    {$group: { _id: "$_id", status: {$first: "$status"} }},
    {$match: { status: "closed"}},
    {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
])



  1. Fáze a zřetězení agregace MongoDB

  2. Uvnitř nové podpory Apache HBase pro MOB

  3. Redis :Jak mohu třídit svůj hash podle klíčů?

  4. Jak implementujete automaticky se zvyšující primární ID v MongoDB?