Definición
$setFieldNuevo en la versión 5.0.
Agrega, actualiza o elimina un campo específico en un documento.
Puede utilizar para agregar, actualizar o eliminar campos con nombres que contengan puntos
$setField().o comiencen con signos de dólar$().Tip
Usar
$getFieldpara recuperar los valores de los campos que contienen signos de dólar ()$o puntos ().que agrega o actualiza$setFieldcon.
Sintaxis
$setField tiene la siguiente sintaxis:
{ $setField: { field: <String>, input: <Object>, value: <Expression> } }
Debes proporcionar los siguientes campos:
Campo | Tipo | Descripción |
|---|---|---|
| String | Campo en el |
| Objeto | Documento que contiene el |
| expresión | El valor que desea asignar Establezca en |
Comportamiento
Si se
inputevalúamissingundefinedcomo,nullo,$setFielddevuelvenully noinputactualiza.Si se
inputevalúa como algo distinto de unmissingobjeto,,undefinednullo, devuelve un$setFielderror.Si
fieldse resuelve en algo distinto a una constante de cadena, devuelve un$setFielderror.Si
fieldno existeinputen, lo$setFieldagrega.$setFieldno recorre implícitamente objetos ni matrices. Por ejemplo, evalúa$setFieldunfieldvalor de"a.b.c"como un campo de nivel superior"a.b.c"en lugar de como un campo{ "a": { "b": { "c": } } }anidado.$unsetFieldes un alias de con un valor de$setFieldentrada$$REMOVEde. Las siguientes expresiones son equivalentes:{ $setField: { field: <field name>, input: “$$ROOT”, value: "$$REMOVE" } } { $unsetField: { field: <field name>, input: “$$ROOT” } }
Ejemplos
Añadir campos que contengan puntos (.)
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 } ]
Agregar campos que comiencen con un signo de dólar$ ()
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 } ]
Actualizar campos que contienen puntos. ()
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 } ]
Actualizar campos que comienzan con un signo de dólar$ ()
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 } ]
Eliminar campos que contienen puntos. ()
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" } } } ] )
Eliminar campos que comienzan con un signo de dólar$ ()
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" } } } ] )