定義
互換性
次の環境でホストされる配置には $filter を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$filter の構文は次のとおりです。
{ $filter: { input: <array>, as: <string>, arrayIndexAs: <string>, cond: <expression>, limit: <number expression> } }
フィールド | 仕様 |
|---|---|
| 配列に解決される式。
|
| 任意。 |
| 任意。 変数名は式で使用できます。例、
例については、「 配列内の各アイテムのインデックスにアクセスする 」と「 バージョン8.3の新機能。 |
| 式 は、ブール値に解決され、要素が出力配列に含まれるべきかどうかを判断するために使用されます。この式は、 |
|
式の詳細については、「式 」を参照してください。
動作
例 | 結果 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||
|
| ||||||||
|
|
例
コレクション 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' } ] } ]
配列内の各項目のインデックスにアクセス
これらのドキュメントを使用して、people という名前のサンプルコレクションを作成します。
db.people.insertMany( [ { _id: 1, name: "Melissa", hobbies: [ "softball", "drawing", "reading" ] }, { _id: 2, name: "Brad", hobbies: [ "gaming", "skateboarding" ] }, { _id: 3, name: "Scott", hobbies: [ "basketball", "music", "fishing" ] }, { _id: 4, name: "Tracey", hobbies: [ "acting", "yoga" ] }, { _id: 5, name: "Josh", hobbies: [ "programming" ] }, { _id: 6, name: "Claire" } ] )
hobbiesフィールドには、各人の趣味の配列がランク付けされています。配列の最初の趣味は、人が最も多くの時間を費やしたその人のプライマリ趣味です。最初の趣味の配列インデックスは 0 です。
次の例ではarrayIndexAs を使用しています。 myIndex 変数には、hobbies 配列内の各趣味のインデックスがあります。この例では、次のフィールドを持つドキュメントが返されます。
人の名前。
secondaryHobbiesその他のすべての趣味を含む配列
db.people.aggregate( [ { $project: { _id: 0, name: 1, secondaryHobbies: { $filter: { input: "$hobbies", arrayIndexAs: "myIndex", cond: { $eq: [ { $mod: [ "$$myIndex", 2 ] }, 0 ] } } } } } ] )
出力:
[ { "name" : "Melissa", "secondaryHobbies" : [ "softball", "reading" ] } { "name" : "Brad", "secondaryHobbies" : [ "gaming" ] } { "name" : "Scott", "secondaryHobbies" : [ "basketball", "fishing" ] } { "name" : "Tracey", "secondaryHobbies" : [ "acting" ] } { "name" : "Josh", "secondaryHobbies" : [ "programming" ] } { "name" : "Claire", "secondaryHobbies" : null } ]
インデックスにアクセスするには を使用します$$IDX
$$IDX変数は、input 配列内の現在の要素のインデックスを返します。式から$$IDX arrayIndexAsフィールドを省略すると、 を使用できます。
次の例では、前のセクションの例と同じドキュメントが返されます。ただし、 $$IDXではなくarrayIndexAs が使用されています。
db.people.aggregate( [ { $project: { _id: 0, name: 1, secondaryHobbies: { $filter: { input: "$hobbies", cond: { $eq: [ { $mod: [ "$$IDX", 2 ] }, 0 ] } } } } } ] )