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

MongoDBで順序が異なる値を含む配列と完全一致検索する方法

MongoDBで順序を問わず配列を完全一致させる検索テクニック

MongoDBでは、「配列に含まれる値は同じだが並び順は異なっていてもよい」という条件で、配列フィールドが完全に一致するドキュメントを取得したい場合があります。このようなケースでは、$all演算子と$size演算子を組み合わせることで実現できます。

サンプルデータの準備

まず、ドキュメントを含むコレクションを作成しましょう。以下が挿入用のクエリです。

> db.exactMatchArrayDemo.insertOne({"StudentName":"David","StudentAge":22,"StudentGameScores":[45,78,98]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9c94702d6669774125246c")
}
> db.exactMatchArrayDemo.insertOne({"StudentName":"Chris","StudentAge":23,"StudentGameScores":[45,78]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9c94a42d6669774125246d")
}

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

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

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

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

{
    "_id" : ObjectId("5c9c94702d6669774125246c"),
    "StudentName" : "David",
    "StudentAge" : 22,
    "StudentGameScores" : [
        45,
        78,
        98
    ]
}
{
    "_id" : ObjectId("5c9c94a42d6669774125246d"),
    "StudentName" : "Chris",
    "StudentAge" : 23,
    "StudentGameScores" : [
        45,
        78
    ]
}

$all演算子と$size演算子による完全一致検索

それでは、配列の完全一致検索を行うクエリを見ていきましょう。$all演算子は「指定した値がすべて含まれていること」を判定し、$size演算子は「配列の要素数が一致していること」を判定します。この2つを組み合わせることで、順序に左右されない正確なマッチングが可能になります。

> db.exactMatchArrayDemo.find({ "StudentGameScores": { "$size" : 2, "$all": [ 78, 45 ] } }).pretty();

実行結果は以下の通りです。値の指定順序が[78, 45]と元の配列[45, 78]と異なっていても、正しく該当ドキュメントが取得できています。

{
    "_id" : ObjectId("5c9c94a42d6669774125246d"),
    "StudentName" : "Chris",
    "StudentAge" : 23,
    "StudentGameScores" : [
        45,
        78
    ]
}

要素数が3つの配列を検索する場合

同様に、順序を気にせず要素数3つの配列を対象に完全一致検索することもできます。ここでは$sizeに3を設定し、「StudentGameScores」フィールドに3つの値を持つドキュメントを取得しています。

> db.exactMatchArrayDemo.find({ "StudentGameScores": { "$size" : 3, "$all": [ 78, 45 ] } }).pretty();

実行結果は次のようになります。Davidのスコア配列[45, 78, 98]には78と45の両方が含まれ、かつ要素数が3であるため、該当ドキュメントとして取得されました。

{
    "_id" : ObjectId("5c9c94702d6669774125246c"),
    "StudentName" : "David",
    "StudentAge" : 22,
    "StudentGameScores" : [
        45,
        78,
        98
    ]
}

まとめ

MongoDBで配列の順序を無視した完全一致検索を行いたい場合は、$all演算子(必須要素の確認)と$size演算子(要素数の確認)を併用するのがポイントです。$allのみだと余分な要素を含む配列もマッチしてしまうため、厳密な完全一致を実現するには$sizeとの組み合わせが不可欠です。この手法を使えば、柔軟かつ正確な配列検索クエリを構築できます。

  1. MongoDBで配列フィールドに対して$allを使って全要素に一致させる方法

    配列フィールドの全要素に一致させるには MongoDBで配列内のすべての指定要素を含むドキュメントを検索したい場合には、$all 演算子を使用します。$all は、対象フィールドの値が配列であり、その配列が指定した要素をすべて含んでいるドキュメントだけを選択するクエリ演算子です。 ここでは、サンプルコレクションを作成し、実際に $all を使った検索手順を順番に見ていきましょう。 1. コレクションへのドキュメント登録 まずは insertOne() メソッドを使って、サンプルコレクション「demo695」にドキュメントを挿入します。 > db.demo695.insertOne({L

  2. MongoDBで特定の値より大きい配列要素を持つドキュメントを照会する方法($elemMatch活用)

    MongoDBで配列内の値を条件に照合するにはMongoDBでは、$elemMatch 演算子を使用することで、指定したすべてのクエリ条件に一致する要素が少なくとも1つ含まれる配列フィールドを持つドキュメントを照合できます。ここでは、配列内の値が特定の値より大きいドキュメントを検索する方法を、具体的なサンプルコードとともに解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。> db.demo701.insertOne({ListOfValues:[100,200,300]}); { acknowledged : true, ins