MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment récupérer le document d'origine après l'agrégation

Tombant dans la catégorie des astuces d'agrégation stupides est une petite technique qui est souvent négligée.

La requête qui fait tout cela se regroupe autour du document _id, étant l'identifiant unique de ce document. Donc, le principal point auquel il faut penser est l'ensemble du document est déjà en fait un identifiant unique. Ainsi, au lieu de simplement stocker la clé _id, utilisez tout le document.

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

Lorsque cela est fait, tout ce qui est enroulé par le _id conserve le document dans sa forme originale. À la fin de toutes les autres étapes d'agrégation, émettez un $project final afin de restaurer la véritable forme originale du document :

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

Ensuite, vous aurez les résultats filtrés que vous souhaitez. Cette technique peut être très pratique lorsqu'elle est utilisée avec un filtrage avancé comme dans le cas de cette requête, car elle supprime le besoin d'émettre une recherche supplémentaire sur tous les résultats.

De plus, dans un tel cas où vous savez que vous recherchez uniquement un ensemble de résultats qui vont correspondre à un certain ensemble de conditions, utilisez un $match opérateur en tant que premier étape du pipeline d'agrégation. Ce n'est pas seulement utile pour réduire la taille du jeu de travail, mais c'est aussi le seul étape à laquelle vous pouvez utiliser un index et où vous pouvez augmenter considérablement les performances des requêtes.

Tout le processus ensemble :

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