Docs Menu
Docs Home
/ /
Arreglos

$addToSet

$addToSet

El operador $addToSet añade un valor a un arreglo a menos que el valor ya esté presente, en cuyo caso $addToSet no hace nada a ese arreglo.

Puedes usar $addToSet para implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

El operador $addToSet tiene la forma:

{ $addToSet: { <field1>: <value1>, ... } }

Para especificar un <field> en un documento incrustado o en un arreglo, utiliza notación de puntos.

A partir de MongoDB 5.0, los operadores de actualización procesan los campos de documentos con nombres basados en cadenas en orden lexicográfico. Los campos con nombres numéricos se procesan en orden numérico. Consulta Comportamiento del operador de actualización para obtener más información.

$addToSet solo asegura que no se añadan elementos duplicados al conjunto y no afecta a los elementos duplicados existentes. $addToSet no garantiza un orden específico de los elementos en el conjunto modificado.

A partir de MongoDB 5.0, mongod ya no genera un error cuando utiliza un operador de actualización como $addToSet con una expresión de operando vacía ( { } ). Una actualización vacía no produce cambios y no genera ninguna entrada en el oplog (lo que significa que la operación es una “no-op").

Si utilizas $addToSet en un campo que está ausente del documento que se va a actualizar, $addToSet crea el campo de tipo arreglo con el valor especificado como su elemento.

Si se usa $addToSet en un campo que no es un arreglo, la operación fallará.

Por ejemplo, cree la colección pigments:

db.pigments.insertOne( { _id: 1, colors: "blue, green, red" } )

El campo colors no es un arreglo. La siguiente operación de $addToSet falla:

db.pigments.updateOne(
{ _id: 1 },
{ $addToSet: { colors: "mauve" } }
)

Si el valor es un arreglo, $addToSet añade todo el arreglo como un único elemento.

Crear la colección alphabet:

db.alphabet.insertOne( { _id: 1, letters: ["a", "b"] } )

La siguiente operación agrega el arreglo [ "c", "d" ] al campo letters:

db.alphabet.updateOne(
{ _id: 1 },
{ $addToSet: { letters: [ "c", "d" ] } }
)

El arreglo [ "c", "d" ] se añade como un único elemento:

{ _id: 1, letters: [ 'a', 'b', [ 'c', 'd' ] ] }

Tip

Para añadir cada elemento del valor por separado, utiliza el modificador $each con $addToSet. Consulta $each Modifier para obtener más detalles.

Si el valor es un documento, MongoDB determina que el documento es un duplicado si un documento existente en el arreglo coincide exactamente con el documento que se va a agregar; es decir, el documento existente tiene exactamente los mismos campos y valores y los campos están en el mismo orden. Por lo tanto, el orden de los campos es importante y no puede especificar que MongoDB compare solo un subconjunto de los campos del documento para determinar si el documento es un duplicado de un elemento existente en el arreglo.

Crear la colección inventory:

db.inventory.insertOne(
{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }
)

La siguiente operación añade el elemento "accessories" al arreglo tags dado que "accessories" no existe en el arreglo:

db.inventory.updateOne(
{ _id: 1 },
{ $addToSet: { tags: "accessories" } }
)

La siguiente operación $addToSet no tiene efecto porque "camera" ya es un elemento del arreglo tags:

db.inventory.updateOne(
{ _id: 1 },
{ $addToSet: { tags: "camera" } }
)

Puedes usar el operador $addToSet con el modificador $each. El modificador $each permite que el Operador $addToSet agregue múltiples valores al campo de arreglo.

Una colección inventory tiene el siguiente documento:

db.inventory.insertOne (
{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }
)

Luego, la operación siguiente utiliza el operador $addToSet con el modificador $each para añadir múltiples elementos al arreglo tags:

db.inventory.updateOne(
{ _id: 2 },
{ $addToSet: { tags: { $each: [ "camera", "electronics", "accessories" ] } } }
)

La operación solo agrega "camera" y "accessories" al arreglo tags. "electronics" ya estaba en el arreglo:

{
_id: 2,
item: "cable",
tags: [ "electronics", "supplies", "camera", "accessories" ]
}

Volver

$[identifier]

En esta página