MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como recuperar o documento original após a agregação


Na categoria de truques estúpidos de agregação é uma pequena técnica que muitas vezes passa despercebida.

A consulta que faz tudo isso está agrupando em torno do documento _id, sendo o identificador exclusivo desse documento. Portanto, o ponto principal a ser considerado é o documento inteiro já é um identificador exclusivo. Portanto, em vez de apenas armazenar na chave _id, use o documento inteiro.
    {$project: { 
        _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
    },

Onde isso é feito, qualquer coisa que seja acumulada pelo _id retém o documento em sua forma original. Ao final de todos os outros estágios de agregação, emita um $project final para restaurar a verdadeira forma do documento original:
    {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}

Então você terá os resultados filtrados que deseja. Essa técnica pode ser muito útil quando usada com filtragem avançada, como no caso desta consulta, pois elimina a necessidade de emitir um find adicional em todos os resultados.

Além disso, no caso em que você sabe que está procurando apenas um conjunto de resultados que corresponderá a um determinado conjunto de condições, use um $match operador como o primeiro etapa do pipeline de agregação. Isso não é útil apenas para reduzir o tamanho do conjunto de trabalho, mas também é o único estágio em que você pode usar um índice e onde você pode aumentar significativamente o desempenho da consulta.

Todo o processo junto:
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"}}
])