$filter(集計)
定義
互換性
次の環境でホストされる配置には $filter
を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$filter
の構文は次のとおりです。
{ $filter: { input: <array>, as: <string>, cond: <expression>, limit: <number expression> } }
フィールド | 仕様 |
---|---|
| 配列に解決される式。
|
| 任意。 |
| 式 は、ブール値に解決され、要素が出力配列に含まれるべきかどうかを判断するために使用されます。この式は、 |
|
式の詳細については、「式演算子」を参照してください。
動作
例 | 結果 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
| ||||||||
|
| ||||||||
|
|
例
コレクション 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' } ] } ]