$getField(集計)
定義
$getField
バージョン 5.0 で追加
ドキュメントから指定したフィールドの値を返します。 オブジェクトを指定しない場合、
$getField
は$$CURRENT
からフィールドの値を返します。$getField
を使用すると、名前にピリオド(.
)が含まれるフィールドやドル記号($
)で始まるフィールドの値を取得できます。Tip
名前にドル記号(
$
)またはピリオド(.
)が含まれるフィールドを追加または更新するには、$setField
を使用します。
構文
$getField
の構文は次のとおりです。
{ $getField: { field: <String>, input: <Object> } }
フィールド | タイプ | 説明 |
---|---|---|
field | 文字列 | |
input | オブジェクト |
$getField
には、 $$CURRENT
からフィールド値を取得するための次の短縮構文があります。
{ $getField: <String> }
この構文では、引数は上記の field
の値と同じになります。
動作
指定した
field
がinput
オブジェクトにない場合、またはinput
オブジェクトを指定していない場合は、$$CURRENT
にない場合、$getField
はmissing
を返します。input
がmissing
、undefined
、またはnull
と評価された場合、$getField
はnull
を返します。input
がオブジェクト以外のオブジェクト(missing
、undefined
、またはnull
)以外と評価された場合、$getField
はエラーを返します。$getField
は、オブジェクトまたは配列を暗黙的にトラバースすることはありません。たとえば、$getField
は、a.b.c
のfield
値を、ネストされたフィールド{ a: { b: { c: } } }
ではなく、最上位フィールドa.b.c
として評価します。
例
ピリオドを含むクエリ フィールド(.
)
以下のドキュメントを持つinventory
コレクションを検討してください。
{ "_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 }
次の操作では、 $getField
演算子と$gt
演算子を使用して、 price.usd
が200
より大きい製品を見つけます。
db.inventory.aggregate( [ { $match: { $expr: { $gt: [ { $getField: "price.usd" }, 200 ] } } } ] )
この操作は次の結果を返します。
[ { _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 }, { _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 } ]
ドル記号($
)で始まるクエリ フィールド
以下のドキュメントを持つinventory
コレクションを検討してください。
{ "_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 }
次の操作では、 $getField
、 $gt
、および$literal
演算子を使用して、 $price
が200
より大きい製品を見つけます。
db.inventory.aggregate( [ { $match: { $expr: { $gt: [ { $getField: {$literal: "$price" } }, 200 ] } } } ] )
この操作は次の結果を返します。
[ { _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 }, { _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 } ]
サブ ドキュメントのフィールドに対するクエリ
次のドキュメントを使用して inventory
コレクションを作成します。
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 } } ] )
次の操作は、$small
アイテムの数が 20
以下であるドキュメントを返します。
db.inventory.aggregate( [ { $match: { $expr: { $lte: [ { $getField: { field: { $literal: "$small" }, input: "$quantity" } }, 20 ] } } } ] )
次の演算子を使用して、コレクションをクエリします。
$lte
演算子は、20 以下の値を検索します。$getField
には明示的なfield
input
$small
パラメーターと パラメーターが必要です。 フィールドはサブドキュメントの一部であるためです。$getField
は$literal
を使用して "$small
" を評価します。フィールド名にドル記号($
)が含まれているためです。
出力例:
[ { _id: 3, item: 'sun dress', 'price.usd': 199.99, quantity: { '$large': 45, '$medium': 40, '$small': 5 } } ]