Definición
$setFieldNuevo en la versión 5.0.
Añade, actualiza o remueve un campo especificado 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 agregues o actualices con$setField.
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 |
| Objeto | Documento que contiene el |
| expresión | El valor que desea asignar Configurado en |
Comportamiento
Si
inputse evalúa comomissing,undefinedonull,$setFieldretornanully no actualizainput.Si
inputevalúa cualquier cosa que no sea un objeto,missing,undefinedonull,$setFielddevuelve un error.Si
fieldresuelve cualquier cosa que no sea una constante de string,$setFielddevuelve un error.Si
fieldno existe eninput,$setFieldlo añade.$setFieldno recorre implícitamente objetos o arreglos. Por ejemplo,$setFieldevalúa un valorfieldde"a.b.c"como un campo de nivel superior"a.b.c"en lugar de como un campo anidado,{ "a": { "b": { "c": } } }.$unsetFieldes un alias para$setFieldcon un valor de entrada de$$REMOVE. 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 etapa del $replaceWith pipeline y el operador $setField para agregar un nuevo campo a cada documento, "price.usd". El valor de "price.usd" será igual al valor de "price" en cada documento. Por último, la operación utiliza la etapa de pipeline $unset para remover el campo "price".
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 el 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 empiecen 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 usa la etapa de pipeline $match para encontrar un documento específico y la etapa de pipeline $replaceWith y los operadores $setField y $literal para actualizar el campo "$price" 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 } ]
Remover campos que contengan 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 etapa de $replaceWith pipeline y el operador $setField y $$REMOVE para remover el campo "price.usd" 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" } } } ] )
Remover campos que comienzan con 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 etapa del pipeline $replaceWith, los operadores $setField y $literal, y $$REMOVE para remover el campo "$price" 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" } } } ] )