Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

$setField (operador de expressão )

$setField

Novidades na versão 5.0.:

Adiciona, atualiza ou remove um campo especificado em um documento.

Você pode usar $setField para 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.

Dica

Use o $getField para recuperar os valores dos campos que contêm sinais de dólar ($) ou pontos (.) que você adiciona ou atualiza com $setField.

$setField tem a seguinte sintaxe:

{
$setField: {
field: <String>,
input: <Object>,
value: <Expression>
}
}

Você deve fornecer os seguintes campos:

Campo
Tipo
Descrição

field

String

Campo no objeto input que você deseja adicionar, atualizar ou remover. field pode ser qualquer expressão válida que resulte em uma constante de string.

input

Objeto

Documento que contém o field que você deseja adicionar ou atualizar. input deve determinar um objeto, missing, null ou undefined.

value

Expressão

O valor que você deseja atribuir a field. value pode ser qualquer expressãoválida.

Defina como $$REMOVE para remover field do documento input.

  • Se input for avaliado como missing, undefined ou null, $setField retornará null e não atualizará input.

  • Se input for avaliado como algo diferente de um objeto, missing, undefined ou null, $setField retornará um erro.

  • Se field resolver para algo diferente de uma constante de string, $setField retornará um erro.

  • Se field não existir em input, $setField adiciona-o.

  • $setField não atravessa implicitamente objetos ou arrays. Por exemplo, $setField avalia um valor field de "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 $setField com 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"
    }
    }

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 }
]

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 }
]

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 }
]

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 }
]

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"
} } }
] )

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"
} } }
] )