sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo recuperar el documento original después de la agregación

Entrar en la categoría de trucos estúpidos de agregación es una pequeña técnica que a menudo se pasa por alto.

La consulta que realiza todo se agrupa en torno al _id del documento, que es el identificador único de este documento. Entonces, el punto principal a tener en cuenta es el documento completo. es en realidad un identificador único ya. Entonces, en lugar de simplemente esconder la clave _id, use el documento completo.

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

Cuando se hace esto, todo lo que se acumula con el _id retiene el documento en su forma original. Al final de todas las demás etapas de agregación, emita un $proyecto final para restaurar la verdadera forma del documento original:

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

Entonces tendrás los resultados filtrados que deseas. Esta técnica puede ser muy útil cuando se usa con filtrado avanzado, como en el caso de esta consulta, ya que elimina la necesidad de emitir un buscar adicional. en todos los resultados.

Además, en el caso de que sepa que solo está buscando un conjunto de resultados que coincidan con un determinado conjunto de condiciones, use un $match operador como el primero etapa de la tubería de agregación. Esto no solo es útil para reducir el tamaño del conjunto de trabajo, sino que también es el único etapa en la que puede hacer uso de un índice y dónde puede aumentar significativamente el rendimiento de las consultas.

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