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

Cómo alternar un elemento en una matriz en mongoDB

Si está actualizando el documento, puede usar la canalización dentro de la actualización . Pero esta función está disponible con MongoDB versión 4.2 o posterior.

db.collection.update(
  { },
  [
     { 
          $set: { 
              arr: { 
                  $cond: [ { $in: [ element, "$arr" ] }, 
                           { $setDifference: [ "$arr", [ element ] ] }, 
                           { $concatArrays: [ "$arr", [ element ] ] } 
                  ] 
              }
          }
     }
  ]
)

NOTA: Asumiendo la variable element es una cadena valor.

Si solo está consultando, puede usar la siguiente agregación:

db.collection.aggregate([
     { 
          $addFields: { 
              arr: { 
                  $cond: [ { $in: [ element, "$arr" ] }, 
                           { $setDifference: [ "$arr", [ element ] ] }, 
                           { $concatArrays: [ "$arr", [ element ] ] } 
                  ] 
              }
          }
     }
] )

Pero, si está utilizando una versión de MongoDB anterior a la 4.2, puede usar la salida agregada de arriba para actualizar el documento:

db.collection.aggregate( [
  // aggregation pipeine from above ...
] ).forEach( doc => db.collection.updateOne( { _id: doc._id }, { $set: { arr: doc.arr } } ) )