MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

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 を返します。この仕様を覚えておくと、要素の存在チェックにも活用できて便利です。

  1. MongoDBで特定フィールドの配列要素数を取得する方法($size演算子の使い方)

    MongoDBでドキュメント内の特定フィールド(配列)に含まれる要素の数をカウントしたい場合は、集計パイプライン(aggregate)と$size演算子を組み合わせるのが最も簡単な方法です。この記事では、実際のコレクションを作成しながら、配列要素数を取得する具体的な手順を解説します。1. サンプルコレクションの作成まず、配列型のフィールド「Subject」を持つドキュメントを含むコレクションを作成します。> db.demo723.insertOne({Subject:[MySQL,MongoDB]}); { acknowledged : true, insertedId

  2. 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 以上である場合(つまり削除範囲の外側にある場合)は、変