No puedo pensar en agregar un nuevo campo con múltiples condiciones en MongoDB. Así es como se ve DB,

const db = [
  {
    _id: 1,
    isActived: false, // Drafted
    isScheduled: false,
    isExpired: false
  },
  {
    _id: 2,
    isActived: true, 
    isScheduled: true, // Scheduled
    isExpired: false
  },
  {
    _id: 3,
    isActived: true, // Expired
    isScheduled: false,
    isExpired: true
  },
  {
    _id: 4,
    isActived: true, // Actived
    isScheduled: false,
    isExpired: false
  },
]

Las condiciones son:

if (!isActived) status = "Draft"
if (isActived && isScheduled) status = "Scheduled"
if (isActived && isExpired) status = "Expired"
if (isActived && !isScheduled && !isExpired) status = "Actived"

Solo puedo descubrir una condición y no puedo resolverla más. Esto es lo que hice hasta ahora

{
      $addFields: {
        status: {
          $cond: [
            {
              $and: [
                { $eq: ["$isActived", true] },
                { $eq: ["$isScheduled", true] },
              ],
            },
            "Actived",
            "Scheduled",
          ],
          $cond: [
            {
              $and: [
                { $eq: ["$isActived", true] },
                { $eq: ["$isExpired", true] },
              ],
            },
            "Actived",
            "Expired",
          ],
        },
      },
    }

El resultado no es el que esperaba. Cualquier sugerencia. Gracias.

0
Teerapat 3 mar. 2021 a las 18:52

2 respuestas

La mejor respuesta

Puede concatenar if/else de esta manera:

Pseudocódigo:

if !isActived:
  return "Draft"
else
  if !isScheduled && !isExpired:
    return "Actived"
  else
    if isScheduled:
      return "Scheduled"
    else
      return "Expired" //<-- Since one of "isScheduled" and "isExpired" should be true

Tenga cuidado con la última línea donde puede tener isScheduled y isExpired en verdadero, para que su lógica pueda cambiar.

db.collection.aggregate([
  {
    "$set": {
      "status": {
        "$cond": {
          "if": {
            "$eq": [
              "$isActived",
              false
            ]
          },
          "then": "Draft",
          "else": {
            "$cond": {
              "if": {
                "$and": [
                  {
                    "$eq": [
                      "$isExpired",
                      false
                    ]
                  },
                  {
                    "$eq": [
                      "$isScheduled",
                      false
                    ]
                  }
                ]
              },
              "then": "Actived",
              "else": {
                "$cond": {
                  "if": {
                    "$eq": [
                      "$isScheduled",
                      true
                    ]
                  },
                  "then": "Scheduled",
                  "else": "Expired"
                }
              }
            }
          }
        }
      }
    }
  }
])

Ejemplo aquí

1
J.F. 3 mar. 2021 a las 16:15

Condiciones anidadas simples, solución de trabajo

db.collection.aggregate([
    {
        $addFields: {
        status: {
            $cond: [
            {
                $and: [
                { $eq: [ "$isActived", true ] },
                { $eq: [ "$isScheduled", false ] },
                { $eq: [ "$isExpired", false ] },
                ],
            },
            "Actived",
            {
                $cond: [
                {
                    $and: [
                    { $eq: [ "$isActived", true ] },
                    { $eq: [ "$isExpired", true ] },
                    ],
                },
                "Expired",
                {
                    $cond: [
                    {
                        $and: [
                        { $eq: [ "$isActived", true ] },
                        { $eq: [ "$isScheduled", true ] },
                        ],
                    },
                    "Scheduled",
                    {
                        $cond: [
                        {
                            $and: [
                            { $eq: [ "$isActived", false ] },                          
                            ],
                        },
                        "Draft",
                        null,
                        ],
                    },
                    ],
                },
                ],
            },
            ],
        },
        },
    },
])
1
Omar Abbas 3 mar. 2021 a las 16:24