Agregue un nuevo campo a cada documento en una colección de MongoDB

Tahseen Tauseef 15 febrero 2024
  1. el operador $set en MongoDB
  2. el operador $setOnInsert en MongoDB
  3. Agregar nuevo campo a documentos en una colección de MongoDB
Agregue un nuevo campo a cada documento en una colección de MongoDB

Este artículo discutirá sobre la operación $set y $setOnInsert. Además, el problema de agregar un campo en colecciones en MongoDB también se explica brevemente usando estos dos operadores.

el operador $set en MongoDB

El operador $set cambia el valor de un campo al valor proporcionado. La expresión del operador $set tiene este aspecto: { $set: { <campo1>: <valor1>, ... } }.

Utilice la notación de puntos para definir un <campo> en un texto incrustado o una matriz.

Comportamiento del Operador $set

Los operadores de actualización manejan campos de documentos con nombres basados en cadenas en orden lexicográfico a partir de MongoDB 5.0. Los campos con nombre numérico se manejan en orden numérico.

Si el campo aún no existe, $set creará uno con el valor solicitado, siempre que el nuevo campo no rompa una restricción de tipo. Si proporciona una ruta punteada para un campo que no existe, $set construirá los documentos incrustados según sea necesario para completar la ruta punteada.

$set actualizará o creará cada campo si proporciona varios pares de valores de campo.

Cuando utiliza un operador de actualización como $set con una expresión de operando vacía ({}) en MongoDB 5.0, mongod ya no arroja un error. No hay modificaciones debido a una actualización vacía, y no se produce ningún registro oplog (lo que significa que la operación es un no-op).

Por ejemplo, creemos la colección ropa:

db.clothes.insertOne(
   {
     _id: 100,
     quantity: 250,
     instock: true,
     reorder: false,
     details: { model: "14RR", make: "Clothes" },
     tags: [ "apparel", "clothing" ],
     ratings: [ { by: "Customer127", rating: 5 } ]
   }
)

Establecer campos de nivel superior

El siguiente procedimiento utiliza el operador $set para alterar el valor de los campos cantidad, detalles y etiquetas para el documento que cumple el criterio _id igual a 100.

db.clothes.updateOne(
   { _id: 100 },
   { $set:
      {
        quantity: 400,
        details: { model: "2600", make: "Fashionables" },
        tags: [ "coats", "outerwear", "clothing" ]
      }
   }
)

La operación actualiza lo siguiente:

  1. valor de cantidad a 400.
  2. Campo detalles con el nuevo documento incrustado.
  3. Campo tags con el nuevo array.

El documento ahora tiene los siguientes valores:

{
  _id: 100,
  quantity: 400,
  instock: true,
  reorder: false,
  details: { model: '2600', make: 'Fashionables' },
  tags: [ 'coats', 'outerwear', 'clothing' ],
  ratings: [ { by: 'Customer127', rating: 5 } ]
}

Establecer campos en documentos incrustados

Utilice la notación de puntos para indicar un <campo> en un texto incrustado o una matriz. La siguiente acción modifica el campo hacer en el documento detalles para el documento que cumple el criterio _id igual a 100:

db.clothes.updateOne(
   { _id: 100 },
   { $set: { "details.make": "Kidz" } }
)

Después de la actualización, el documento ahora tiene los siguientes valores:

Establecer campos en documentos incrustados - Salida

Establecer elementos en matrices

Utilice la notación de puntos para indicar un <campo> en un texto incrustado o una matriz.

La siguiente acción modifica el valor segundo elemento en el campo tags y el campo ratings en el primer elemento de la matriz ratings para el documento que cumple el criterio _id igual a 100.

db.clothes.updateOne(
   { _id: 100 },
   { $set:
      {
        "tags.1": "rain wear",
        "ratings.0.rating": 3
      }
   }
)

Después de la actualización, el documento ahora tiene los siguientes valores:

Establecer elementos en matrices - Salida

el operador $setOnInsert en MongoDB

Si se inserta un documento debido a una operación de actualización con upsert: true, $setOnInsert aplica los valores proporcionados a los campos del documento. $setOnInsert no hace nada si la acción de actualización no da como resultado una inserción.

Se puede especificar la opción upsert.

Comportamiento del Operador $setOnInsert

Los operadores de actualización manejan campos de documentos con nombres basados en cadenas en orden lexicográfico a partir de MongoDB 5.0. Los campos con nombre numérico se manejan en orden numérico.

Cuando usa un operador de actualización como $setOnInsert con una expresión de operando vacía ({}) en MongoDB 5.0, mongod ya no arroja un error. No hay modificaciones debido a una actualización vacía, y no se produce ningún registro oplog (lo que significa que la operación es un no-op).

Por ejemplo, la colección ropa no contiene documentos. Insertaremos un nuevo documento usando db.collection.updateOne() con el parámetro upsert: true.

db.clothes.updateOne(
  { _id: 1 },
  {
     $set: { item: "banana" },
     $setOnInsert: { defaultQty: 100 }
  },
  { upsert: true }
)

MongoDB utiliza <consulta> para crear un nuevo documento con el identificador _id: 1. $setOnInsert realiza los cambios solicitados en el documento.

El documento recién insertado se encuentra en la colección ropa:

{ "_id" : 1, "item" : "banana", "defaultQty" : 100 }

Cuando el parámetro upsert es true, el método db.collection.updateOne():

  1. Crea un nuevo documento,
  2. Aplica la operación $set,
  3. Aplica la operación $setOnInsert.

Si db.collection.updateOne() coincide con un documento existente, MongoDB solo aplica la operación $set.

Agregar nuevo campo a documentos en una colección de MongoDB

Puede usar los siguientes métodos para agregar un nuevo campo a cada documento en una colección en MongoDB.

También se muestran ejemplos de uso de cada método con equipos de recolección con los siguientes documentos:

db.teams.insertOne({team: "United", position: "Defence", points: 31})
db.teams.insertOne({team: "Spurs", position: "Defence", points: 22})
db.teams.insertOne({team: "Palace", position: "Center", points: 19})
db.teams.insertOne({team: "Eagles", position: "Forward", points: 26})
db.teams.insertOne({team: "Lions", position: "Defence", points: 33})

Agregar nuevo campo sin valores

Sintaxis:

db.collection.updateMany({}, {$set:{"new_field": null}})

Puede usar el siguiente código para agregar un nuevo campo llamado “rebotes” con un valor “nulo” a cada documento existente en la colección:

db.teams.updateMany({}, {$set:{"rebounds": null}})

Puede escribir la siguiente consulta para ver los primeros documentos actualizados:

db.teams.find().limit(3)

Esta consulta devuelve los siguientes documentos:

Agregar nuevo campo sin valores - Salida

Agregar nuevo campo con valor específico

Sintaxis:

db.collection.updateMany({}, {$set:{"new_field": 10}})

Puede usar el siguiente código para agregar un nuevo campo llamado rebotes con un valor de 10 a cada documento existente en la colección:

db.teams.updateMany({}, {$set:{"rebounds": 10}})

Puede escribir la siguiente consulta para ver los primeros documentos actualizados:

db.teams.find().limit(3)

Esta consulta devuelve los siguientes documentos:

Agregar nuevo campo con valor específico - Salida

Agregar nuevo campo usando valores de campos existentes

Sintaxis:

db.collection.updateMany(
    {},
    [
        {"$set": {"name": { "$concat": ["$field1", " ", "$field2"]}}}
    ]
)

Puede usar el siguiente código para agregar un campo llamado nombre, cuyo valor es una concatenación de los campos existentes equipo y cargo.

db.teams.updateMany(
    {},
    [
        {"$set": {"name": { "$concat": ["$team", " ", "$position"]}}}
    ]
)

Puede escribir la siguiente consulta para ver los primeros documentos actualizados:

db.teams.find().limit(3)

Esta consulta devuelve los siguientes documentos:

Agregar nuevo campo usando valores de campos existentes - Salida

Artículo relacionado - MongoDB Collection