MongoDBで配列フィールド内の特定要素のインデックスを取得する方法
MongoDBでは、配列フィールド内に格納された特定の要素が何番目に位置しているか(インデックス)を調べたい場面があります。そんなときに便利なのが、集計フレームワークで使える $indexOfArray 演算子です。
この記事では、実際にドキュメントを作成しながら、$indexOfArray の使い方を具体的な例とともに解説します。
サンプルコレクションの作成
まず、insertOne() メソッドを使って、講師情報を含むドキュメントをコレクションに挿入します。
> db.getIndexDemo.insertOne({"InstructorName":"Chris","InstructorSubject":["MongoDB","MySQL","Java","C++"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd5251de8cc557214c0df8")
}次に、find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.getIndexDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cbd5251de8cc557214c0df8"),
"InstructorName" : "Chris",
"InstructorSubject" : [
"MongoDB",
"MySQL",
"Java",
"C++"
]
}$indexOfArray演算子で要素のインデックスを取得する
配列フィールド内の特定要素のインデックスを取得するには、aggregate() メソッドと $project ステージを組み合わせて $indexOfArray を使用します。
たとえば、「MongoDB」という要素のインデックスを取得するクエリは以下のとおりです。
> db.getIndexDemo.aggregate( [ { "$project": { "matchedIndex": { "$indexOfArray": [ "$InstructorSubject", "MongoDB" ] } } } ] );実行結果は次のようになります。
{ "_id" : ObjectId("5cbd5251de8cc557214c0df8"), "matchedIndex" : 0 }「MongoDB」は配列の先頭にあるため、インデックスとして 0 が返されました。
同様に、別の要素「C++」のインデックスを取得してみます。
> db.getIndexDemo.aggregate( [ { "$project": { "matchedIndex": { "$indexOfArray": [ "$InstructorSubject", "C++" ] } } } ] );実行結果:
{ "_id" : ObjectId("5cbd5251de8cc557214c0df8"), "matchedIndex" : 3 }「C++」は配列の4番目の要素なので、インデックス 3 が返されています。
注意点:配列のインデックスは0から始まる
多くのプログラミング言語と同様に、MongoDBの配列インデックスも 0から始まります。つまり、配列の最初の要素のインデックスは0であり、最後の要素のインデックスは「n - 1」(nは配列の要素数)となります。
また、$indexOfArray は指定した要素が配列内に存在しない場合、-1 を返します。この仕様を覚えておくと、要素の存在チェックにも活用できて便利です。
-
MongoDBで特定フィールドの配列要素数を取得する方法($size演算子の使い方)
MongoDBでドキュメント内の特定フィールド(配列)に含まれる要素の数をカウントしたい場合は、集計パイプライン(aggregate)と$size演算子を組み合わせるのが最も簡単な方法です。この記事では、実際のコレクションを作成しながら、配列要素数を取得する具体的な手順を解説します。1. サンプルコレクションの作成まず、配列型のフィールド「Subject」を持つドキュメントを含むコレクションを作成します。> db.demo723.insertOne({Subject:[MySQL,MongoDB]}); { acknowledged : true, insertedId
-
C++で指定したインデックス範囲[L–R]の配列要素を削除する方法
C++では、指定したインデックス範囲 [L–R] に含まれる要素を配列から効率的に取り除くことができます。本記事では、その基本的な考え方と具体的な実装方法を解説します。アルゴリズムの考え方まず、元の配列と削除対象となる排他的な範囲を定義し、配列の長さを求めます。int arr[] = { 2,4,6,8,10,12,14,16,18,20}; int L = 2, R = 6; int length = sizeof(arr) / sizeof(arr[0]);次に、配列を先頭から順に走査します。インデックス i が L 以下、または R 以上である場合(つまり削除範囲の外側にある場合)は、変