Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

$filter(集計)

項目一覧

  • 定義
  • 互換性
  • 構文
  • 動作
  • 数値比較に基づくフィルタリング
  • 制限フィールドを使用する
  • 一致する可能性より大きい制限
  • string の等価一致に基づくフィルタリング
  • 正規式一致に基づくフィルタリング
$filter

指定条件に基づいて、配列のサブセットを選択して返します。条件に一致する要素のみを含む配列を返します。返される要素は元の順序のままです。

次の環境でホストされる配置には $filter を使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

$filter の構文は次のとおりです。

{
$filter:
{
input: <array>,
as: <string>,
cond: <expression>,
limit: <number expression>
}
}
フィールド
仕様
input

配列に解決される

inputnull に解決されるか、欠落しているフィールドを参照する場合、$filternull を返します。

input が配列以外、null 以外の値に解決される場合、パイプラインはエラーになります。

as
任意。input 配列の各要素を表す変数の名前。名前が指定されていない場合、変数名はデフォルトで this になります。
cond
は、ブール値に解決され、要素が出力配列に含まれるべきかどうかを判断するために使用されます。この式は、input 配列の各要素を、as で指定された変数名で個別に参照します。
limit

任意。 $filterが返す一致する配列要素の数を制限する数値式。 1未満の制限は指定できません。 一致する配列要素は、入力配列に現れる順序で返されます。

指定されたlimitが一致する配列要素の数より大きい場合、 $filterは一致するすべての配列要素を返します。 制限がnullの場合、 $filterは一致するすべての配列要素を返します。

式の詳細については、「式 」を参照してください。

結果
{
$filter: {
input: [ 1, "a", 2, null, 3.1, NumberLong(4), "5" ],
as: "num",
cond: { $isNumber: "$$num" }
}
}
[ 1, 2, 3.1, NumberLong(4) ]
{
$filter: {
input: [ 1, "a", 2, null, 3.1, NumberLong(4), "5" ],
as: "num",
cond: { $isNumber: "$$num" },
limit: 2
}
}
[ 1, 2 ]
{
$filter: {
input: [ 1, "a", 2, null, 3.1, NumberLong(4), "5" ],
as: "num",
cond: { $isNumber: "$$num" },
limit: { $add: [ 0, 1 ] }
}
}
[ 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 配列をフィルタリングして、price100 以上のドキュメントのみを含めます。

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: [] }
]

この例では、前の例の 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' } ]
}
]

戻る

$expMovalingAvg