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

MongoDBで配列に特定の要素のみが含まれるドキュメントを抽出する方法

MongoDBでは、配列型フィールドに対して配列をそのまま検索条件として指定することで、「その配列が特定の要素だけで構成されている」ドキュメントを正確に抽出できます。この記事では、サンプルコレクションの作成から、find()メソッドを使った検索方法まで、実際のコード例とともにわかりやすく解説します。

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

まず、insertOne()メソッドを使ってドキュメントを挿入し、テスト用のコレクション「arrayContainOnlySpecificFieldDemo」を作成します。ここでは、学生の名前・年齢・技術科目(配列)を格納するシンプルな構造を採用しています。

> db.arrayContainOnlySpecificFieldDemo.insertOne(
...     {
...        "StudentName":"John",
...        "StudentAge":21,
...        "StudentTechnicalSubject":["C","Java","MongoDB"]
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc4921dac184d684e3fa26a")
}
> db.arrayContainOnlySpecificFieldDemo.insertOne( { "StudentName":"Carol", "StudentAge":23, "StudentTechnicalSubject":["MongoDB"] } );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc49237ac184d684e3fa26b")
}

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

find()メソッドにpretty()を組み合わせると、コレクション内のすべてのドキュメントを整形された読みやすい形式で表示できます。クエリは以下の通りです。

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

実行すると、次の2件のドキュメントが出力されます。Johnさんの「StudentTechnicalSubject」には3つの科目が含まれている一方、Carolさんには「MongoDB」だけが含まれている点に注目してください。

{
    "_id" : ObjectId("5cc4921dac184d684e3fa26a"),
    "StudentName" : "John",
    "StudentAge" : 21,
    "StudentTechnicalSubject" : [
       "C",
       "Java",
       "MongoDB"
    ]
}
{
    "_id" : ObjectId("5cc49237ac184d684e3fa26b"),
    "StudentName" : "Carol",
    "StudentAge" : 23,
    "StudentTechnicalSubject" : [
       "MongoDB"
    ]
}

3. 配列に特定の要素のみが含まれるドキュメントを検索する

配列フィールドが特定の値のみを持つオブジェクトを選択したい場合は、find()メソッドの検索条件に、期待する配列をそのまま指定します。以下のクエリは、「StudentTechnicalSubject」が["MongoDB"]のみであるドキュメントを取得します。

> db.arrayContainOnlySpecificFieldDemo.find({"StudentTechnicalSubject":["MongoDB"]}).pretty();

実行結果は次の通りです。配列が完全に一致するCarolさんのドキュメントだけが返されていることがわかります。

{
    "_id" : ObjectId("5cc49237ac184d684e3fa26b"),
    "StudentName" : "Carol",
    "StudentAge" : 23,
    "StudentTechnicalSubject" : [
       "MongoDB"
    ]
}

4. 注意点:完全一致と部分一致の違い

上記の方法は「配列全体が指定した配列と完全一致する場合」にのみマッチします。そのため、JohnさんのようにCやJavaなど他の要素も含まれるドキュメントは、たとえMongoDBを含んでいても検索結果には現れません。

もし「MongoDBという要素さえ含まれていればよく、他の要素があっても構わない」という条件で検索したい場合は、次のようにフィールドに単一の値を指定します。

> db.arrayContainOnlySpecificFieldDemo.find({"StudentTechnicalSubject":"MongoDB"}).pretty();

さらに、複数の要素をすべて含んでいることを確認したい場合は、$all演算子を利用すると便利です。用途に応じてこれらの方法を使い分けることで、柔軟かつ正確な配列検索が可能になります。

  1. 特定のフィールドが存在しないMongoDBドキュメントを取得する方法

    MongoDBでは、$exists演算子を使用して特定のフィールドの有無を確認できます。ドキュメント内に目的のフィールドが存在しない場合、そのドキュメントをfind()やアグリゲーション(集計)パイプラインで取得して表示することが可能です。本記事では、配列内のサブドキュメントに特定のフィールド(例:Age)が含まれていないドキュメントを抽出する方法を、具体的なサンプルコードとともに解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、demo612というコレクションにドキュメントを挿入しています。> db.demo612.insertO

  2. MongoDBの$projectで配列内の特定フィールドだけを表示し、他のフィールドを除外する方法

    MongoDBの集計パイプライン(Aggregation Pipeline)では、$projectと$unwindを組み合わせることで、配列内の特定のフィールドだけを表示できます。逆に、不要なフィールドを除外したい場合は、そのフィールドの値を0に設定します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。> db.demo731.insertOne({ ProductInformation: [ { ProductId:Product-1, ProductPrice:80 }, { ProductId:Product-2, ProductPrice:45