Definição
$setFieldNovidades na versão 5.0.:
Adiciona, atualiza ou remove um campo especificado em um documento.
Você pode usar
$setFieldpara adicionar, atualizar ou remover campos com nomes que contenham pontos (.) ou começar com cifrões de dólar ($).Não confie em nomes de campo prefixados em 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 campos com pontos e cifrões.
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
Se
inputfor avaliado comomissing,undefinedounull,$setFieldretornaránulle não atualizaráinput.Se
inputfor avaliado como algo diferente de um objeto,missing,undefinedounull,$setFieldretornará um erro.Se
fieldresolver para algo diferente de uma constante de string,$setFieldretornará um erro.Se
fieldnão existir eminput,$setFieldadiciona-o.$unsetFieldé um alias para$setFieldcom um valor de entrada de$$REMOVE. As seguintes expressões são equivalentes:{ $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 } ] )
A operação a seguir usa a $replaceWith etapa do pipeline e o operador para adicionar um novo campo a cada $setField documento,. "price.usd" O valor de "price.usd" é igual ao valor de "price" em cada documento. Finalmente, a operação utiliza o $unset estágio do pipeline para remover o "price" campo.
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 } ] )
A operação a seguir usa o $replaceWith estágio de pipeline e os operadores $setField e para adicionar um novo campo a cada documento,.$literal "$price" O valor de "$price" é igual ao valor de "price" em cada documento. Por fim, a operação usa o $unset estágio do pipeline para remover o "price" campo.
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 } ] )
A operação a seguir utiliza o estágio de pipeline $match para encontrar um documento específico e o estágio de pipeline $replaceWith e o operador $setField para atualizar o campo "price.usd" no documento correspondente:
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 } ] )
A operação a seguir usa o estágio de pipeline $match para localizar um documento específico e o estágio de pipeline $replaceWith e os operadores $setField e $literal para atualizar o campo "$price" no documento correspondente:
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 } ] )
A operação a seguir usa o estágio de pipeline $replaceWith e o operador $setField e $$REMOVE para remover o campo "price.usd" de cada documento:
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 uma Assinatura em Dólares ($)
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 } ] )
A operação a seguir usa o estágio de pipeline $replaceWith, os operadores $setField e $literal, e $$REMOVE para remover o campo "$price" de cada documento:
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" } } } ] )