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, retornará o valor do
$getFieldcampo$$CURRENTde.Você pode usar
$getFieldpara recuperar o valor de campos com nomes que contenham pontos (.) ou comecem com 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
Se
fieldresolver para algo diferente de uma constante de string,$getFieldretornará um erro.Se o
fieldque você especificar não estiver presente no objetoinputou em$$CURRENTse você não especificar um objetoinput,$getFieldretornarámissing.Se
inputavaliar comomissing,undefinedounull,$getFieldretornaránull.Se
inputfor avaliado como algo diferente de um objeto,missing,undefinedounull,$getFieldretornará um erro.$getFieldnão atravessa implicitamente objetos ou arrays. Por exemplo,$getFieldavalia um valorfielddea.b.ccomo um campo de nível superiora.b.cem vez de um campo aninhado{ a: { b: { c: } } }.
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.$getFieldutiliza$literalpara avaliar "$small", pois o nome do campo tem um sinal de dólar ($).
Saída de exemplo:
[ { _id: 3, item: 'sun dress', 'price.usd': 199.99, quantity: { '$large': 45, '$medium': 40, '$small': 5 } } ]