MongoDBでは、 $ indexOfArray
集計パイプライン演算子は、指定された値の出現を配列で検索し、最初の出現の配列インデックスを返します。
構文
構文は次のようになります:
{ $indexOfArray: [ <array expression>, <search expression>, <start>, <end> ] }
場所:
<配列式>
検索する配列です。<検索式>コード> 配列で検索する値です。
-
-
MongoDBでは、配列はゼロベースであるため、インデックスカウントはゼロ( 0
)から始まります。 。
指定された値が見つからない場合は、 $ indexOfArray
-1
を返します 。
指定された値のインスタンスが複数ある場合は、最初のインスタンスのみが返されます。
例
products
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "XS", "M", "L" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "XS", "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XXS", "XS", "M", "XL" ] } { "_id" : 4, "prod" : "Zap", "sizes" : [ 10, 12, 15 ] } { "_id" : 5, "prod" : "Tap", "sizes" : [ 15, 16, 20 ] }
$ indexOfArray
を適用する例を次に示します。 それらのドキュメントへ:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
sizes: 1,
result: { $indexOfArray: [ "$sizes", "XS" ] }
}
}
]
)
結果:
{ "sizes" : [ "XS", "M", "L" ], "result" : 0 } { "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 } { "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : 1 } { "sizes" : [ 10, 12, 15 ], "result" : -1 } { "sizes" : [ 15, 16, 20 ], "result" : -1 }
最初の2つのドキュメントでは、検索値は 0
の位置で見つかりました。 (配列はゼロベースです。)
3番目のドキュメントでは、位置 1
で見つかりました 。完全一致が検索されたことに注意してください。位置0
を返しませんでした 、位置 0
の値であっても 検索値が含まれます(つまり、 XXS
XS
が含まれています 。
最後の2つのドキュメントで検索値が見つからなかったため、 -1
返されました。
別の例を次に示しますが、今回は数値を検索します。
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
sizes: 1,
result: { $indexOfArray: [ "$sizes", 15 ] }
}
}
]
)
結果:
{ "sizes" : [ "XS", "M", "L" ], "result" : -1 } { "sizes" : [ "XS", "S", "L", "XL" ], "result" : -1 } { "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 } { "sizes" : [ 10, 12, 15 ], "result" : 2 } { "sizes" : [ 15, 16, 20 ], "result" : 0 }
開始位置を指定
3番目の引数を指定して、検索の開始インデックス位置を指定できます。
例:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 4, 5 ] } } },
{
$project:
{
_id: 0,
sizes: 1,
result: { $indexOfArray: [ "$sizes", 15, 1 ] }
}
}
]
)
結果:
{ "sizes" : [ 10, 12, 15 ], "result" : 2 } { "sizes" : [ 15, 16, 20 ], "result" : -1 }
この場合、検索式は2番目のドキュメント(ドキュメント5)で見つかりませんでした。これは、 1
の位置から検索を開始したためです。 、およびそのドキュメントには検索式が含まれていますが、位置は 0
です。 (検索の開始位置の前)
終了位置を指定
4番目の引数を指定して、検索の終了インデックス位置を指定することもできます。
この引数を指定する場合は、開始位置も指定する必要があります。そうしないと、この議論が出発点として解釈されることになります。
例:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
sizes: 1,
result: { $indexOfArray: [ "$sizes", "XS", 0, 1 ] }
}
}
]
)
結果:
{ "sizes" : [ "XS", "M", "L" ], "result" : 0 } { "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 } { "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }
3番目のドキュメントは-1
を返しました これは、検索式が見つからなかったことを意味します。
インデックスの終了位置を1つ増やすと、次のようになります。
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
sizes: 1,
result: { $indexOfArray: [ "$sizes", "XS", 0, 2 ] }
}
}
]
)
結果:
{ "sizes" : [ "XS", "M", "L" ], "result" : 0 } { "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 } { "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : 1 }
今回は値が含まれ、そのインデックス位置が返されました。
空のアレイ
空の配列を検索すると、 -1
が返されます 。
db.products.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
sizes: 1,
result: { $indexOfArray: [ "$sizes", "XS" ] }
}
}
]
)
結果:
{ "sizes" : [ ], "result" : -1 }
欠落しているフィールド
フィールドがドキュメントにない場合は、 $ indexOfArray
null
を返します 。
次のドキュメントがあるとします。
{ "_id" : 8, "prod" : "Map" }
$ indexOfArray
を適用すると次のようになります :
db.products.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
sizes: 1,
result: { $indexOfArray: [ "$sizes", "XS" ] }
}
}
]
)
結果:
{ "result" : null }
ヌル値
配列式がnull
の場合 (配列の代わりに)、 $ indexOfArray
null
を返します 。
次のドキュメントがあるとします。
{ "_id" : 7, "prod" : "Lap", "sizes" : null }
$ indexOfArray
を適用すると次のようになります :
db.products.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
sizes: 1,
result: { $indexOfArray: [ "$sizes", "XS" ] }
}
}
]
)
結果:
{ "sizes" : null, "result" : null }
ただし、検索式が null
の場合 、結果は -1
です。 、配列式も null
でない限り またはそのフィールドがありません:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5, 6, 7, 8 ] } } },
{
$project:
{
_id: 0,
sizes: 1,
result: { $indexOfArray: [ "$sizes", null ] }
}
}
]
)
結果:
{ "sizes" : [ "XS", "M", "L" ], "result" : -1 } { "sizes" : [ "XS", "S", "L", "XL" ], "result" : -1 } { "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 } { "sizes" : [ 10, 12, 15 ], "result" : -1 } { "sizes" : [ 15, 16, 20 ], "result" : -1 } { "sizes" : [ ], "result" : -1 } { "sizes" : null, "result" : null } { "result" : null }
間違ったデータ型
配列式が間違ったデータ型の場合、 $ indexOfArray
エラーを返します。
次のドキュメントがあるとします。
{ "_id" : 9, "prod" : "Box", "sizes" : "XXL" }
$ indexOfArray
を適用すると次のようになります そのドキュメントへ:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 9 ] } } },
{
$project:
{
_id: 0,
sizes: 1,
result: { $indexOfArray: [ "$sizes", "XXL" ] }
}
}
]
)
結果:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$indexOfArray requires an array as a first argument, found: string", "code" : 40090, "codeName" : "Location40090" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
エラーメッセージに示されているように、$indexOfArrayには最初の引数として配列が必要です
。