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

Consulta MongoDB con grupo condicional por declaración

Su código no funciona porque $cond no es un operador acumulador. Solo estos operadores de acumulador, se pueden usar en un $group escenario.

Suponiendo que sus registros no contengan más de dos valores posibles de source como menciona en su pregunta, podría agregar un $project condicional escenario y modificar el $group etapa como,

Código:

    db.customer.aggregate([
        {
            $group: {
                "_id": {
                    "id": "$id",
                    "firstName": "$firstName",
                    "lastName": "$lastName",
                    "code": "$code"
                },
                "sourceA": { $first: "$source" },
                "sourceB": { $last: "$source" }
            }
        },
        {
            $project: {
                "source": {
                    $cond: [
                        { $eq: ["$sourceA", "email"] },
                        "$sourceB",
                        "$sourceA"
                    ]
                }
            }
        }
    ])

En caso de que haya más de dos valores posibles para la fuente, podría hacer lo siguiente:

  • Group por el id , firstName , lastName y code . Acumule los valores únicos de source , utilizando $addToSet operador.
  • Utilice $redact para mantener solo los valores que no sean email .
  • Project los campos obligatorios, si la source la matriz está vacía (se han eliminado todos los elementos), agregue un valor email a ella.
  • Unwind el campo fuente para mostrarlo como un campo y no como una matriz. (opcional)

Código:

    db.customer.aggregate([
        {
            $group: {
                "_id": {
                    "id": "$id",
                    "firstName": "$firstName",
                    "lastName": "$lastName",
                    "code": "$code"
                },
                "sourceArr": { $addToSet: { "source": "$source" } }
            }
        },
        {
            $redact: {
                $cond: [
                    { $eq: [{ $ifNull: ["$source", "other"] }, "email"] },
                    "$$PRUNE",
                    "$$DESCEND"
                ]
            }
        },
        {
            $project: {
                "source": {
                    $map: {
                        "input":
                        {
                            $cond: [
                                { $eq: [{ $size: "$sourceArr" }, 0] },
                                [{ "source": "item" }],
                                "$sourceArr"]
                        },
                        "as": "inp",
                        "in": "$$inp.source"
                    }
                }
            }
        }
    ])