Definição
$setFieldNovidade na versão 5.0.
Adiciona, atualiza ou remove um campo especificado em um documento.
Você pode usar para adicionar, atualizar ou remover campos com nomes que contenham
$setFieldpontos.() ou começar com cifrões de dólar$().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 para recuperar os valores de campos que contêm
$getFieldcifrões$() ou pontos.() que você adiciona ou atualiza$setFieldcom.
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
inputavaliarmissingpara,undefinednullou,$setFieldgeranulle nãoinputatualiza.Se for
inputavaliado como algo diferente de um objeto,,missingundefinednullou, retornará um$setFielderro.Se
fieldresolver para algo diferente de uma constante de string, retornará um$setFielderro.Se
fieldnão existirinputem,$setFieldadiciona-o.$unsetFieldé um alias para com um valor de$setFieldentrada$$REMOVEde. 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 $match estágio de pipeline para encontrar um documento específico e o $replaceWith estágio de pipeline e o operador para atualizar $setField o "price.usd" campo 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 utiliza a $match etapa de pipeline para localizar um documento específico e a $replaceWith etapa de pipeline e os operadores $setField $literal e para atualizar o "$price" campo 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 seguinte operação utiliza o $replaceWith estágio do pipeline e o $setField operador e para remover $$REMOVE o "price.usd" campo 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 $replaceWith estágio de $setField pipeline,$literal os operadores e, e para remover $$REMOVE o "$price" campo 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" } } } ] )