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

MongoDBで別の配列に存在する値を検索し、見つかった値のインデックスを新しい配列に出力する方法

この目的を実現するには、MongoDBの $indexOfArray 演算子を使用します。$indexOfArray は、指定した配列の中から特定の値を検索し、その値が最初に見つかった位置(インデックス)を返します。値が見つからない場合は -1 が返されます。

1. コレクションとドキュメントの作成

まず、insertOne() メソッドを使ってサンプル用のコレクションを作成します。

> db.demo381.insertOne({"Values":[10,40,60,30,60]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5b59f72ae06a1609a00b15")
}
> db.demo381.insertOne({"Values":[100,500,700,500,800]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5b59f72ae06a1609a00b16")
}
> db.demo381.insertOne({"Values":[20,40,30,10,60]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5b59f72ae06a1609a00b17")
}

2. ドキュメントの確認

find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

> db.demo381.find();

上記のクエリを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e5b59f72ae06a1609a00b15"), "Values" : [ 10, 40, 60, 30, 60 ] }
{ "_id" : ObjectId("5e5b59f72ae06a1609a00b16"), "Values" : [ 100, 500, 700, 500, 800 ] }
{ "_id" : ObjectId("5e5b59f72ae06a1609a00b17"), "Values" : [ 20, 40, 30, 10, 60 ] }

3. 配列を検索してインデックスを新しい配列に出力するクエリ

次のクエリでは、aggregate() フレームワーク内で $project ステージと $map 演算子を組み合わせています。検索対象となる値の配列 [10, 40] の各要素について、$indexOfArray を使って「Values」フィールド内の位置を調べ、その結果を新しいフィールド「Result」に出力します。

> db.demo381.aggregate([
...    {"$project":{
...       "Result":{
...          "$map":{
...             "input":[10,40],
...             "in":{"$indexOfArray":["$Values","$$this"]}
...          }
...       }
...    }}
... ])

クエリの実行結果

上記の集計パイプラインを実行すると、以下のような出力が得られます。

{ "_id" : ObjectId("5e5b59f72ae06a1609a00b15"), "Result" : [ 0, 1 ] }
{ "_id" : ObjectId("5e5b59f72ae06a1609a00b16"), "Result" : [ -1, -1 ] }
{ "_id" : ObjectId("5e5b59f72ae06a1609a00b17"), "Result" : [ 3, 1 ] }

結果の読み方

  • 1つ目のドキュメント:Values が [10, 40, 60, 30, 60] であるため、「10」はインデックス0、「40」はインデックス1に存在します。結果は [0, 1] となります。
  • 2つ目のドキュメント:Values が [100, 500, 700, 500, 800] であり、「10」も「40」も存在しないため、結果は [-1, -1] となります。
  • 3つ目のドキュメント:Values が [20, 40, 30, 10, 60] であるため、「10」はインデックス3、「40」はインデックス1に存在します。結果は [3, 1] となります。

このように、$map と $indexOfArray を組み合わせることで、複数の検索値についてそれぞれの位置を効率的に新しい配列として取得できます。

  1. MongoDBでフィールド値に含まれる「@email」のような文字列を検索する方法

    MongoDBのfind()メソッドを使えば、正規表現(Regex)を活用して、フィールド値の中から特定の文字列を柔軟に検索できます。本記事では、「@email」という文字列を含むドキュメントを検索する方法を、実際のコード例とともに解説します。1. 検索用コレクションの作成まずは、メールアドレスを格納したドキュメントを持つコレクションを作成しましょう。> db.demo727.insertOne({UserId:John@email.com}); { acknowledged : true, insertedId : ObjectId(5eab375f4341781127

  2. C#でCSVファイルを読み込んで配列に格納する方法

    CSVファイルとは、カンマ(Comma-Separated Values)でデータを区切って保存するテキストファイル形式です。データを表形式で整理して格納できるため、多くの企業が業務データの保存や交換に利用しています。C#では、StreamReaderクラスを使用してファイルを操作します。このクラスは、ファイルを開いて読み取るだけでなく、さまざまな種類のファイルに対して多様な処理を行うことができます。もちろん、CSVファイルの読み込みにも活用できます。具体的には、OpenRead()メソッドでCSVファイルを開き、ReadLine()メソッドで内容を1行ずつ読み込みます。読み込んだ各行はSpl