Definição
- $getField
- Novidades 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 (- $).- 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 objeto- inputou em- $$CURRENTse você não especificar um objeto- input,- $getFieldretornará- missing.
- Se - inputavaliar como- missing,- undefinedou- null,- $getFieldretornará- null.
- Se - inputfor avaliado como algo diferente de um objeto,- missing,- undefinedou- null,- $getFieldretornará um erro.
- $getFieldnão atravessa implicitamente objetos ou arrays. Por exemplo,- $getFieldavalia um valor- fieldde- a.b.ccomo um campo de nível superior- a.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âmetros- fielde- inputexplí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 }   } ]