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

Novidade na versão 5.0.

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

You can use $setField to 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 $getField to retrieve the values of fields that contain dollar signs ($) or periods (.) that you add or update with $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.

  • If input evaluates to missing, undefined, or null, $setField returns null and does not update input.

  • If input evaluates to anything other than an object, missing, undefined, or null, $setField returns an error.

  • If field resolves to anything other than a string constant, $setField returns an error.

  • If field doesn't exist in input, $setField adds it.

  • $setField doesn't implicitly traverse objects or arrays. For example, $setField evaluates a field value of "a.b.c" as a top-level field "a.b.c" instead of as a nested field, { "a": { "b": { "c": } } }.

  • $unsetField is an alias for $setField with an input value of $$REMOVE. The following expressions are equivalent:

    {
    $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 }
] )

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

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

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

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

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

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