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

$elemMatch演算子を使った配列フィールドを持つドキュメントの検索方法【MongoDB】

MongoDBで配列フィールド内の要素に基づいてドキュメントを検索したい場合、$elemMatch 演算子を使用します。$elemMatch を使うことで、配列内の同一の要素に対して複数の条件を同時に適用できるのが大きな特徴です。

この記事では、実際にコレクションを作成し、配列フィールドを含むドキュメントを $elemMatch で照合する手順を解説します。

1. テスト用コレクションの作成

まず、配列フィールド details を持つドキュメントを挿入して、サンプルコレクションを作成しましょう。

> db.demo592.insertOne(
...     {
...        "id":101,
...        "details" : [
...           { "Name" : "Chris", "Value" : "200"},
...           {"Name" : "David", "Value" : "800"}
...        ]
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e930d8ffd2d90c177b5bcd6")
}
> db.demo592.insertOne(
... {
...    id:102,
...    "details" : [
...       { "Name" : "Chris", "Value" : "500"},
...       {"Name" : "David", "Value" : "900"}
...    ]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e930d90fd2d90c177b5bcd7")
}

2. 登録済みドキュメントの確認

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

> db.demo592.find();

上記のコマンドを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e930d8ffd2d90c177b5bcd6"), "id" : 101, "details" : [
   { "Name" : "Chris", "Value" : "200" },
   { "Name" : "David", "Value" : "800" }
] }
{ "_id" : ObjectId("5e930d90fd2d90c177b5bcd7"), "id" : 102, "details" : [
   { "Name" : "Chris", "Value" : "500" },
   { "Name" : "David", "Value" : "900" }
] }

3. $elemMatchと$andを組み合わせた照合クエリ

ここからが本題です。次の例では、「Name が Chris で Value が 500 以上である要素」と「Name が David で Value が 600 以上である要素」を同じドキュメント内の details 配列に持つドキュメントを検索しています。

> db.demo592.find(
...    {
...       "$and" : [
...          { "details" : { "$elemMatch" : { "Name" : "Chris", "Value" : { "$gte" : "500" } } } },
...          { "details" : { "$elemMatch" : { "Name" : "David", "Value" : { "$gte" : "600" } } } }
...       ]
...    }
... );

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

{ "_id" : ObjectId("5e930d90fd2d90c177b5bcd7"), "id" : 102, "details" : [
   { "Name" : "Chris", "Value" : "500" }, { "Name" : "David", "Value" : "900" }
] }

結果のポイント

出力を見ると、id: 102 のドキュメントだけが一致していることがわかります。id: 101 のドキュメントは Chris の Value が "200" であり条件($gte: "500")を満たしていないため除外されました。

$and 演算子で複数の $elemMatch 条件を組み合わせることで、「配列内の別々の要素がそれぞれ異なる条件を満たす」という柔軟な検索が可能になります。なお、単一の要素に対して複数条件を課す場合は、1つの $elemMatch 内に条件をまとめるだけで十分です。

  1. MongoDBで特定のフィールドを含むドキュメントを検索する方法

    MongoDBで特定のフィールドを含むドキュメントを検索する方法MongoDBで特定のフィールドを持つドキュメントを検索するには、$exists 演算子を使用します。この演算子を利用すると、指定したフィールドが存在するドキュメントだけを効率的に抽出できます。以下、具体的な手順を見ていきましょう。1. コレクションの作成まず、サンプル用のコレクションにドキュメントを挿入します。> db.findDocumentContainsSpecificFieldDemo.insertOne({ProductPrices:{Product1:10,Product2:50}});{  

  2. 【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方

    MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド