Definição
$setFieldNovidade na versão 5.0.
Adiciona, atualiza ou remove um campo especificado em um documento.
You can use
$setFieldto add, update, or remove fields with names that contain periods (.) or start with dollar signs ($).Não confie em nomes de campo com prefixo de dólar de nível raiz que colidem com nomes de campo de metadados internos reservados, pois esses campos podem ser descartados ou inacessíveis em alguns contextos de processamento de query. Para restrições e orientações sobre nomes de campo que contêm cifrões (
$) ou pontos (.), consulte Nomes de campo com pontos e cifrões.Dica
Use
$getFieldto retrieve the values of fields that contain dollar signs ($) or periods (.) that you add or update with$setField.
Sintaxe
$setField tem a seguinte sintaxe:
{ $setField: { field: <String>, input: <Object>, value: <Expression> } }
Você deve fornecer os seguintes campos:
Campo | Tipo | Descrição |
|---|---|---|
| String | Campo no objeto |
| Objeto | Documento que contém o |
| Expressão |
Comportamento
If
inputevaluates tomissing,undefined, ornull,$setFieldreturnsnulland does not updateinput.If
inputevaluates to anything other than an object,missing,undefined, ornull,$setFieldreturns an error.If
fieldresolves to anything other than a string constant,$setFieldreturns an error.If
fielddoesn't exist ininput,$setFieldadds it.$unsetFieldis an alias for$setFieldwith an input value of$$REMOVE. The following expressions are equivalent:{ $setField: { field: <field name>, input: "$$ROOT", value: "$$REMOVE" } } { $unsetField: { field: <field name>, input: "$$ROOT" } }
Exemplos
Adicionar Campos que Contêm Períodos (.)
Considere uma coleção inventory com os seguintes 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 } ] )
The following operation uses the $replaceWith pipeline stage and the $setField operator to add a new field to each document, "price.usd". The value of "price.usd" equals the value of "price" in each document. Finally, the operation uses the $unset pipeline stage to remove the "price" field.
db.inventory.aggregate( [ { $replaceWith: { $setField: { field: "price.usd", input: "$$ROOT", value: "$price" } } }, { $unset: "price" } ] )
A operação retorna os seguintes 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 } ]
Adicionar campos que começam com um cifrão ($)
Considere uma coleção inventory com os seguintes 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 } ] )
The following operation uses the $replaceWith pipeline stage and the $setField and $literal operators to add a new field to each document, "$price". The value of "$price" equals the value of "price" in each document. Finally, the operation uses the $unset pipeline stage to remove the "price" field.
db.inventory.aggregate( [ { $replaceWith: { $setField: { field: { $literal: "$price" }, input: "$$ROOT", value: "$price" } } }, { $unset: "price" } ] )
A operação retorna os seguintes 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 } ]
Atualizar Campos que Contêm Períodos (.)
Considere uma coleção inventory com os seguintes 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 } ] )
The following operation uses the $match pipeline stage to find a specific document and the $replaceWith pipeline stage and the $setField operator to update the "price.usd" field in the matching document:
db.inventory.aggregate( [ { $match: { _id: 1 } }, { $replaceWith: { $setField: { field: "price.usd", input: "$$ROOT", value: 49.99 } } } ] )
A operação retorna os seguintes resultados:
[ { _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 49.99 } ]
Atualizar campos que começam com um cifrão ($)
Considere uma coleção inventory com os seguintes 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 } ] )
The following operation uses the $match pipeline stage to find a specific document and the $replaceWith pipeline stage and the $setField and $literal operators to update the "$price" field in the matching document:
db.inventory.aggregate( [ { $match: { _id: 1 } }, { $replaceWith: { $setField: { field: { $literal: "$price" }, input: "$$ROOT", value: 49.99 } } } ] )
A operação retorna os seguintes resultados:
[ { _id: 1, item: 'sweatshirt', qty: 300, '$price': 49.99 } ]
Remover campos que contêm períodos (.)
Considere uma coleção inventory com os seguintes 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 } ] )
The following operation uses the $replaceWith pipeline stage and the $setField operator and $$REMOVE to remove the "price.usd" field from each document:
db.inventory.aggregate( [ { $replaceWith: { $setField: { field: "price.usd", input: "$$ROOT", value: "$$REMOVE" } } } ] )
A operação retorna os seguintes 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 } ]
Uma query semelhante escrita utilizando o nome alternativo $unsetField retorna os mesmos resultados:
db.inventory.aggregate( [ { $replaceWith: { $unsetField: { field: "price.usd", input: "$$ROOT" } } } ] )
Remover campos que começam com um cifrão ($)
Considere uma coleção inventory com os seguintes 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 } ] )
The following operation uses the $replaceWith pipeline stage, the $setField and $literal operators, and $$REMOVE to remove the "$price" field from each document:
db.inventory.aggregate( [ { $replaceWith: { $setField: { field: { $literal: "$price" }, input: "$$ROOT", value: "$$REMOVE" } } } ] )
A operação retorna os seguintes 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 } ]
Uma query semelhante escrita utilizando o nome alternativo $unsetField retorna os mesmos resultados:
db.inventory.aggregate( [ { $replaceWith: { $unsetField: { field: { $literal: "$price" }, input: "$$ROOT" } } } ] )
Dica