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