$filter(集計)
定義
互換性
次の環境でホストされる配置には $filter
を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$filter
の構文は次のとおりです。
{ $filter: { input: <array>, as: <string>, cond: <expression>, limit: <number expression> } }
フィールド | 仕様 |
---|---|
input | 配列に解決される式。
|
as | |
cond | |
limit |
式の詳細については、「式 」を参照してください。
動作
例 | 結果 | ||||||||
---|---|---|---|---|---|---|---|---|---|
| [ 1, 2, 3.1, NumberLong(4) ] | ||||||||
| [ 1, 2 ] | ||||||||
| [ 1 ] |
例
コレクション sales
は、次のドキュメントを含みます。
db.sales.insertMany( [ { _id: 0, items: [ { item_id: 43, quantity: 2, price: 10, name: "pen" }, { item_id: 2, quantity: 1, price: 240, name: "briefcase" } ] }, { _id: 1, items: [ { item_id: 23, quantity: 3, price: 110, name: "notebook" }, { item_id: 103, quantity: 4, price: 5, name: "pen" }, { item_id: 38, quantity: 1, price: 300, name: "printer" } ] }, { _id: 2, items: [ { item_id: 4, quantity: 1, price: 23, name: "paper" } ] } ] )
数値比較に基づくフィルタリング
次の例では、items
配列をフィルタリングして、price
が 100
以上のドキュメントのみを含めます。
db.sales.aggregate( [ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $gte: [ "$$item.price", 100 ] } } } } } ] )
[ { _id: 0, items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ] }, { _id: 1, items: [ { item_id: 23, quantity: 3, price: 110, name: 'notebook' }, { item_id: 38, quantity: 1, price: 300, name: 'printer' } ] }, { _id: 2, items: [] } ]
制限フィールドを使用する
この例では、前の例の sales
コレクションを使用しています。
この例では、 limit
フィールドを使用して、各items
配列で返される一致する要素の数を指定します。
db.sales.aggregate( [ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $gte: [ "$$item.price", 100 ] }, limit: 1 } } } } ] )
[ { _id: 0, items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ] }, { _id: 1, items: [ { item_id: 23, quantity: 3, price: 110, name: 'notebook' } ] }, { _id: 2, items: [] } ]
一致する可能性より大きい制限
この例では、前の例の sales
コレクションを使用しています。
この例では、返される一致する要素の可能な数より大きいlimit
フィールド値が使用されています。 この場合、 limit
はクエリ結果に影響を与えず、 $gte
フィルタ条件に一致するすべてのドキュメントを返します。
db.sales.aggregate( [ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $gte: [ "$$item.price", 100] }, limit: 5 } } } } ] )
[ { _id: 0, items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ] }, { _id: 1, items: [ { item_id: 23, quantity: 3, price: 110, name: 'notebook' }, { item_id: 38, quantity: 1, price: 300, name: 'printer' } ] }, { _id: 2, items: [] } ]
string の等価一致に基づくフィルタリング
この例では、前の例の sales
コレクションを使用しています。
以下のitems
の集計フィルターでは、 name
の値はpen
です。
db.sales.aggregate( [ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $eq: [ "$$item.name", "pen"] } } } } } ] )
[ { _id: 0, items: [ { item_id: 43, quantity: 2, price: 10, name: 'pen' } ] }, { _id: 1, items: [ { item_id: 103, quantity: 4, price: 5, name: 'pen' } ] }, { _id: 2, items: [] } ]
正規式一致に基づくフィルタリング
この例では、前の例の sales
コレクションを使用しています。
次の集計では、 $regexMatch
を使用して、 p
で始まるname
値を持つitems
をフィルタリングします。
db.sales.aggregate( [ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $regexMatch: { input: "$$item.name", regex: /^p/ } } } } } } ] )
[ { _id: 0, items: [ { item_id: 43, quantity: 2, price: 10, name: 'pen' } ] }, { _id: 1, items: [ { item_id: 103, quantity: 4, price: 5, name: 'pen' }, { item_id: 38, quantity: 1, price: 300, name: 'printer' } ] }, { _id: 2, items: [ { item_id: 4, quantity: 1, price: 23, name: 'paper' } ] } ]