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 ($).Dica
Use
$getFieldpara recuperar os valores de campos que contêm cifrões ($) ou pontos (.) que você adiciona ou atualiza com$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
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.$setFieldnão atravessa implicitamente objetos ou arrays. Por exemplo,$setFieldavalia um valorfieldde"a.b.c"como um campo de nível superior"a.b.c"em vez de um campo aninhado,{ "a": { "b": { "c": } } }.$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 o estágio de pipeline $replaceWith e o operador $setField para adicionar um novo campo a cada documento, "price.usd". O valor de "price.usd" será igual ao valor de "price" em cada documento. Finalmente, a operação utiliza o estágio do pipeline $unset para remover o campo "price".
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 utiliza o estágio do pipeline $replaceWith e os operadores $setField e $literal para adicionar um novo campo a cada documento, "$price". O valor de "$price" será igual ao valor de "price" em cada documento. Por fim, a operação utiliza o estágio do pipeline $unset para remover o campo "price".
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 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 $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" } } } ] )