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

MongoDBでオブジェクト配列からクエリに一致した要素のみを取得する方法

MongoDBでオブジェクト配列から一致する要素だけを取得する方法

MongoDBでは、プロジェクション演算子 $elemMatch を使うことで、ドキュメント内のオブジェクト配列から、クエリ条件に一致した要素だけを抽出できます。通常の find() では配列全体が返されてしまいますが、$elemMatch や位置演算子 $ を組み合わせることで、必要な要素だけを効率的に取り出せます。

本記事では、まずサンプルデータとなるコレクションを作成し、その後、条件に合致する要素のみを取得する2つの方法を解説します。

1. サンプルコレクションの作成

まず、オブジェクト配列を含むドキュメントを挿入してコレクションを作成します。以下のクエリを実行してください。

> db.objectArray.insert({"Persons":[
   {"PersonName":"Adam","PersonSalary":25000},{"PersonName":"Larry","PersonSalary":27000
   }]});
   WriteResult({ "nInserted" : 1 })
> db.objectArray.insert({"Persons":[
   {"PersonName":"David","PersonSalary":32000},{"PersonName":"Carol","PersonSalary":77000
   }]});
   WriteResult({ "nInserted" : 1 })

これで、「Persons」というオブジェクト配列を持つ2件のドキュメントが登録されました。

2. 登録されたドキュメントの確認

find() メソッドを使って、登録済みのすべてのドキュメントを表示してみましょう。

> db.objectArray.find().pretty();

実行結果は以下のとおりです。

{
   "_id" : ObjectId("5c6bfadc68174aae23f5ef53"),
   "Persons" : [
      {
          "PersonName" : "Adam",
          "PersonSalary" : 25000
      },
      {
          "PersonName" : "Larry",
          "PersonSalary" : 27000
      }
   ]
}
{
   "_id" : ObjectId("5c6bfb0968174aae23f5ef54"),
   "Persons" : [
      {
          "PersonName" : "David",
          "PersonSalary" : 32000
      },
      {
          "PersonName" : "Carol",
          "PersonSalary" : 77000
      }
   ]
}

3. $elemMatch を使って一致する要素のみを取得する

それでは、オブジェクト配列の中から条件に一致する要素だけを取得するクエリを見てみましょう。第2引数のプロジェクションで _id:0 を指定すると、_id フィールドが結果から除外されます(表示されなくなります)。

> db.objectArray.find({"Persons.PersonSalary":25000}, {
_id:0,Persons:{$elemMatch:{"PersonSalary":25000}}}).pretty();

実行結果は以下のとおりです。「PersonSalary」が 25000 の要素(Adam)だけが返されていることがわかります。

{
   "Persons" : [
      {
          "PersonName" : "Adam",
          "PersonSalary" : 25000
      }
   ]
}

4. 代替方法:位置演算子 $ を使う方法

同じ結果は、プロジェクション演算子 $(位置演算子)を使っても得られます。これは、クエリ条件に最初に一致した配列要素のみを返す演算子です。

> db.objectArray.find({"Persons.PersonSalary":25000}, { _id:0,'Persons.$':1}).pretty();

実行結果は以下のとおりです。

{
   "Persons" : [
      {
          "PersonName" : "Adam",
          "PersonSalary" : 25000
      }
   ]
}

まとめ

MongoDBでオブジェクト配列から特定の要素だけを取得したい場合は、$elemMatch または位置演算子 $ をプロジェクションに指定します。複数の条件で配列要素を絞り込みたい場合には $elemMatch が便利で、クエリ条件に最初に一致した1件だけを取得したい場合には $ 演算子が適しています。用途に応じて使い分けるとよいでしょう。

  1. MongoDBコレクションから最大値のドキュメントを取得する方法

    MongoDBコレクションから最大値のドキュメントを取得する方法 MongoDBのコレクションから特定フィールドが最大のドキュメントを取得したい場合は、sort()メソッドで降順に並べ替え、limit(1)を組み合わせるのが基本かつ効率的な方法です。 この記事では、実際にコレクションを作成しながら、最大値を取得するクエリの書き方を具体的な実行例とともに解説します。 1. サンプルコレクションの作成 まず、テスト用のコレクションにドキュメントを挿入してみましょう。 > db.demo669.insertOne({Marks:76}); { acknowledged : true,

  2. MongoDBで配列の要素を1つだけ取得する方法|$slice演算子の使い方

    MongoDBの$sliceで配列の要素を1つだけ取得する配列から特定の件数の要素だけを取り出したい場合、MongoDBでは$slice演算子を使用します。$sliceはプロジェクション演算子の一種で、指定した件数分の配列要素のみを返すことができます。ここでは、実際にコレクションを作成し、$sliceを使って配列の先頭1件だけを取得する手順を順番に見ていきましょう。サンプルデータの作成まず、insertOne()メソッドを使ってドキュメントをコレクションに挿入します。> db.demo579.insertOne( ... { ... _id : 101, ...