Docs Menu
Docs Home
/ /

$setField (agregación)

$setField

Nuevo en la versión 5.0.

Agrega, actualiza o elimina un campo específico en un documento.

Puedes utilizar $setField para agregar, actualizar o eliminar campos con nombres que contengan puntos (). o comiencen con signos de dólar$ ().

Tip

Usar $getField para recuperar los valores de los campos que contienen signos de dólar ()$ o puntos (). que agrega o actualiza $setField con.

$setField tiene la siguiente sintaxis:

{
$setField: {
field: <String>,
input: <Object>,
value: <Expression>
}
}

Debes proporcionar los siguientes campos:

Campo
Tipo
Descripción

field

String

Campo en el input objeto que desea agregar, actualizar o eliminar. field puede ser cualquier expresión válida que se resuelva en una constante de cadena.

input

Objeto

Documento que contiene el field que desea agregar o actualizar. input debe resolverse en un objeto, missing, null o undefined.

value

expresión

El valor que desea asignar field a. value puede ser cualquier expresión válida.

Establezca en $$REMOVE field para eliminar del input documento.

  • Si se input evalúa missing undefinedcomo,null o, $setField devuelve null y no input actualiza.

  • Si se input evalúa como algo distinto de unmissing objeto,, undefined nullo, devuelve un$setField error.

  • Si field se resuelve en algo distinto a una constante de cadena, devuelve un$setField error.

  • Si field no existe input en, lo$setField agrega.

  • $setField no recorre implícitamente objetos ni matrices. Por ejemplo, evalúa$setField un field valor de "a.b.c" como un campo de nivel superior "a.b.c" en lugar de como un campo{ "a": { "b": { "c": } } } anidado.

  • $unsetField es un alias de con un valor de $setField entrada $$REMOVE de. Las siguientes expresiones son equivalentes:

    {
    $setField: {
    field: <field name>,
    input: "$$ROOT",
    value: "$$REMOVE"
    }
    }
    {
    $unsetField: {
    field: <field name>,
    input: "$$ROOT"
    }
    }

Considere una colección inventory con los siguientes documentos:

db.inventory.insertMany( [
{ _id: 1, item: "sweatshirt", price: 45.99, qty: 300 },
{ _id: 2, item: "winter coat", price: 499.99, qty: 200 },
{ _id: 3, item: "sun dress", price: 199.99, qty: 250 },
{ _id: 4, item: "leather boots", price: 249.99, qty: 300 },
{ _id: 5, item: "bow tie", price: 9.99, qty: 180 }
] )

La siguiente operación utiliza la $replaceWith etapa de canalización y el operador para añadir un nuevo campo a cada $setField documento,. "price.usd" El valor de "price.usd" será igual al valor de "price" en cada documento. Finalmente, la operación utiliza la etapa de canalización para eliminar $unset el "price" campo.

db.inventory.aggregate( [
{ $replaceWith: {
$setField: {
field: "price.usd",
input: "$$ROOT",
value: "$price"
} } },
{ $unset: "price" }
] )

La operación devuelve los siguientes resultados:

[
{ _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 45.99 },
{ _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 },
{ _id: 3, item: 'sun dress', qty: 250, 'price.usd': 199.99 },
{ _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 },
{ _id: 5, item: 'bow tie', qty: 180, 'price.usd': 9.99 }
]

Considere una colección inventory con los siguientes documentos:

db.inventory.insertMany( [
{ _id: 1, item: "sweatshirt", price: 45.99, qty: 300 },
{ _id: 2, item: "winter coat", price: 499.99, qty: 200 },
{ _id: 3, item: "sun dress", price: 199.99, qty: 250 },
{ _id: 4, item: "leather boots", price: 249.99, qty: 300 },
{ _id: 5, item: "bow tie", price: 9.99, qty: 180 }
] )

La siguiente operación utiliza la $replaceWith etapa de canalización y los operadores $setField y para agregar un nuevo campo a cada $literal "$price" documento,. El valor de "$price" será igual al valor de "price" en cada documento. Finalmente, la operación utiliza la etapa de canalización para eliminar $unset el "price" campo.

db.inventory.aggregate( [
{ $replaceWith: {
$setField: {
field: { $literal: "$price" },
input: "$$ROOT",
value: "$price"
} } },
{ $unset: "price" }
] )

La operación devuelve los siguientes resultados:

[
{ _id: 1, item: 'sweatshirt', qty: 300, '$price': 45.99 },
{ _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 },
{ _id: 3, item: 'sun dress', qty: 250, '$price': 199.99 },
{ _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 },
{ _id: 5, item: 'bow tie', qty: 180, '$price': 9.99 }
]

Considere una colección inventory con los siguientes documentos:

db.inventory.insertMany( [
{ _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 45.99 },
{ _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 },
{ _id: 3, item: 'sun dress', qty: 250, 'price.usd': 199.99 },
{ _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 },
{ _id: 5, item: 'bow tie', qty: 180, 'price.usd': 9.99 }
] )

La siguiente operación utiliza la $match etapa de canalización para encontrar un documento específico y la $replaceWith etapa de canalización y el operador para actualizar $setField el "price.usd" campo en el documento coincidente:

db.inventory.aggregate( [
{ $match: { _id: 1 } },
{ $replaceWith: {
$setField: {
field: "price.usd",
input: "$$ROOT",
value: 49.99
} } }
] )

La operación devuelve los siguientes resultados:

[
{ _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 49.99 }
]

Considere una colección inventory con los siguientes documentos:

db.inventory.insertMany([
{ _id: 1, item: 'sweatshirt', qty: 300, '$price': 45.99 },
{ _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 },
{ _id: 3, item: 'sun dress', qty: 250, '$price': 199.99 },
{ _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 },
{ _id: 5, item: 'bow tie', qty: 180, '$price': 9.99 }
] )

La siguiente operación utiliza la $match etapa de canalización para encontrar un documento específico y la $replaceWith etapa de canalización y los operadores $setField $literal y para actualizar el "$price" campo en el documento coincidente:

db.inventory.aggregate( [
{ $match: { _id: 1 } },
{ $replaceWith: {
$setField: {
field: { $literal: "$price" },
input: "$$ROOT",
value: 49.99
} } }
] )

La operación devuelve los siguientes resultados:

[
{ _id: 1, item: 'sweatshirt', qty: 300, '$price': 49.99 }
]

Considere una colección inventory con los siguientes documentos:

db.inventory.insertMany([
{ _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 45.99 },
{ _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 },
{ _id: 3, item: 'sun dress', qty: 250, 'price.usd': 199.99 },
{ _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 },
{ _id: 5, item: 'bow tie', qty: 180, 'price.usd': 9.99 }
] )

La siguiente operación utiliza la $replaceWith etapa de canalización y el $setField operador y para eliminar $$REMOVE el "price.usd" campo de cada documento:

db.inventory.aggregate( [
{ $replaceWith: {
$setField: {
field: "price.usd",
input: "$$ROOT",
value: "$$REMOVE"
} } }
] )

La operación devuelve los siguientes resultados:

[
{ _id: 1, item: 'sweatshirt', qty: 300 },
{ _id: 2, item: 'winter coat', qty: 200 },
{ _id: 3, item: 'sun dress', qty: 250 },
{ _id: 4, item: 'leather boots', qty: 300 },
{ _id: 5, item: 'bow tie', qty: 180 }
]

Una consulta similar escrita utilizando el $unsetField alias devuelve los mismos resultados:

db.inventory.aggregate( [
{ $replaceWith: {
$unsetField: {
field: "price.usd",
input: "$$ROOT"
} } }
] )

Considere una colección inventory con los siguientes documentos:

db.inventory.insertMany( [
{ _id: 1, item: 'sweatshirt', qty: 300, '$price': 45.99 },
{ _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 },
{ _id: 3, item: 'sun dress', qty: 250, '$price': 199.99 },
{ _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 },
{ _id: 5, item: 'bow tie', qty: 180, '$price': 9.99 }
] )

La siguiente operación utiliza la $replaceWith etapa de $setField canalización,$literal los operadores y, y para eliminar $$REMOVE el "$price" campo de cada documento:

db.inventory.aggregate( [
{ $replaceWith: {
$setField: {
field: { $literal: "$price" },
input: "$$ROOT",
value: "$$REMOVE"
} } }
] )

La operación devuelve los siguientes resultados:

[
{ _id: 1, item: 'sweatshirt', qty: 300 },
{ _id: 2, item: 'winter coat', qty: 200 },
{ _id: 3, item: 'sun dress', qty: 250 },
{ _id: 4, item: 'leather boots', qty: 300 },
{ _id: 5, item: 'bow tie', qty: 180 }
]

Una consulta similar escrita utilizando el $unsetField alias devuelve los mismos resultados:

db.inventory.aggregate( [
{ $replaceWith: {
$unsetField: {
field: { $literal: "$price" },
input: "$$ROOT"
} } }
] )

Volver

$setEquals

En esta página