Definição
$getFieldNovidades na versão 5.0.:
Retorna o valor de um campo especificado de um documento. Se você não especificar um objeto,
$getFieldretornará o valor do campo de$$CURRENT.Você pode usar
$getFieldpara recuperar o valor de campos com nomes que contenham pontos (.) ou comecem com cifrões ($).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
$setFieldpara adicionar ou atualizar campos com nomes que contenham cifrões ($) ou pontos (.).
Sintaxe
$getField tem a seguinte sintaxe:
{ $getField: { field: <String>, input: <Object> } }
Campo | Tipo | Descrição |
|---|---|---|
| String | |
| Objeto |
$getField tem a seguinte sintaxe reduzida para recuperar valores de campo de $$CURRENT:
{ $getField: <String> }
Para esta sintaxe, o argumento é equivalente ao valor de field descrito acima.
Comportamento
Exemplos
Campos de query que contêm pontos (.)
Considere uma coleção inventory com os seguintes documentos:
db.inventory.insertMany( [ { _id: 1, item: "sweatshirt", "price.usd": 45.99, qty: 300 }, { _id: 2, item: "winter coat", "price.usd": 499.99, qty: 200 }, { _id: 3, item: "sun dress", "price.usd": 199.99, qty: 250 }, { _id: 4, item: "leather boots", "price.usd": 249.99, qty: 300 }, { _id: 5, item: "bow tie", "price.usd": 9.99, qty: 180 } ] )
A operação a seguir utiliza os operadores $getField e $gt para descobrir quais produtos têm price.usd maior que 200:
db.inventory.aggregate( [ { $match: { $expr: { $gt: [ { $getField: "price.usd" }, 200 ] } } } ] )
A operação retorna os seguintes resultados:
[ { _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 }, { _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 } ]
Campos de consulta 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 os operadores $getField, $gt e $literal para descobrir quais produtos têm $price maior que 200:
db.inventory.aggregate( [ { $match: { $expr: { $gt: [ { $getField: {$literal: "$price" } }, 200 ] } } } ] )
A operação retorna os seguintes resultados:
[ { _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 }, { _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 } ]
Consultar um campo em um subdocumento
Cria uma collection inventory com os seguintes documentos:
db.inventory.insertMany( [ { _id: 1, item: "sweatshirt", "price.usd": 45.99, quantity: { "$large": 50, "$medium": 50, "$small": 25 } }, { _id: 2, item: "winter coat", "price.usd": 499.99, quantity: { "$large": 35, "$medium": 35, "$small": 35 } }, { _id: 3, item: "sun dress", "price.usd": 199.99, quantity: { "$large": 45, "$medium": 40, "$small": 5 } }, { _id: 4, item: "leather boots", "price.usd": 249.99, quantity: { "$large": 20, "$medium": 30, "$small": 40 } }, { _id: 5, item: "bow tie", "price.usd": 9.99, quantity: { "$large": 0, "$medium": 10, "$small": 75 } } ] )
A operação seguinte retorna documentos onde o número de $small itens é menor ou igual a 20.
db.inventory.aggregate( [ { $match: { $expr: { $lte: [ { $getField: { field: { $literal: "$small" }, input: "$quantity" } }, 20 ] } } } ] )
Use estes operadores para consultar a coleção:
O operador
$ltelocaliza valores menores ou iguais a 20.$getFieldrequer parâmetrosfieldeinputexplícitos porque o campo$smallfaz parte de um subdocumento.
Saída de exemplo:
[ { _id: 3, item: 'sun dress', 'price.usd': 199.99, quantity: { '$large': 45, '$medium': 40, '$small': 5 } } ]