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

MongoDBで複数の条件(範囲指定)を使って配列内の値を検索するクエリの書き方

MongoDBで複数の条件(範囲指定)を使って配列内の値を検索するクエリの書き方

MongoDBで配列内の値を特定の範囲で検索したい場合、比較演算子の $gt(〜より大きい)と $lt(〜より小さい)を組み合わせて使用します。さらに、配列の各要素に対して複数の条件をまとめて適用したいときは、$elemMatch 演算子を併用するのが効果的です。

この記事では、実際にコレクションを作成しながら、「価格が600より大きく900未満」といった複数の基準をもとに配列内の値を検索する具体的な手順を解説します。

ステップ1:サンプルコレクションの作成

まずは insertOne() メソッドを使ってドキュメントを挿入し、コレクションを作成します。各ドキュメントには顧客名(Name)と、複数の商品価格情報を持つ配列(productDetails)が格納されています。

> db.demo341.insertOne({
...     "Name": "Chris",
...     "productDetails" : [
...         {
...             "ProductPrice" : {
...                 "Price" : 800
...             }
...         },
...         {
...             "ProductPrice" : {
...                 "Price" : 400
...             }
...         },
...         {
...             "ProductPrice" : {
...                 "Price" : 300
...             }
...         }
...     ]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e53ed5cf8647eb59e5620a7")
}

続いて、2つ目のドキュメントを挿入します。こちらは価格帯の異なる商品情報を含んでいます。

> db.demo341.insertOne({
...     "Name": "Chris",
...     "productDetails" : [
...         {
...             "ProductPrice" : {
...                 "Price" : 1000
...             }
...         },
...         {
...             "ProductPrice" : {
...                 "Price" : 1200
...             }
...         },
...         {
...             "ProductPrice" : {
...                 "Price" : 1300
...             }
...         }
...     ]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e53edc1f8647eb59e5620a8")
}

ステップ2:find()メソッドで全ドキュメントを確認

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

> db.demo341.find();

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

{
    "_id" : ObjectId("5e53ed5cf8647eb59e5620a7"), "Name" : "Chris", "productDetails" : [
        { "ProductPrice" : { "Price" : 800 } }, { "ProductPrice" : { "Price" : 400 } },
        { "ProductPrice" : { "Price" : 300 } }
    ]
}
{
    "_id" : ObjectId("5e53edc1f8647eb59e5620a8"), "Name" : "Chris", "productDetails" : [
        { "ProductPrice" : { "Price" : 1000 } }, { "ProductPrice" : { "Price" : 1200 } },
        { "ProductPrice" : { "Price" : 1300 } }
    ]
}

ステップ3:$elemMatchと$gt・$ltを組み合わせた範囲検索クエリ

ここからが本題です。集計パイプライン(aggregate)の中で $match を使い、$elemMatch によって配列要素に対して「600より大きく900未満」という複数の条件を同時に適用します。

> db.demo341.aggregate([
...     { "$match": {
...         "productDetails": {
...             "$elemMatch": {
...                 "ProductPrice.Price": {
...                     "$gt": 600,
...                     "$lt": 900
...                 }
...             }
...         }
...     }}
... ]).pretty();

このクエリを実行すると、条件に合致する価格(800円)を持つ最初のドキュメントのみが出力されます。

{
    "_id" : ObjectId("5e53ed5cf8647eb59e5620a7"),
    "Name" : "Chris",
    "productDetails" : [
        {
            "ProductPrice" : {
                "Price" : 800
            }
        },
        {
            "ProductPrice" : {
                "Price" : 400
            }
        },
        {
            "ProductPrice" : {
                "Price" : 300
            }
        }
    ]
}

クエリのポイント解説

  • $elemMatch:配列内の「同一の要素」が複数の条件をすべて満たしているかどうかを判定する演算子です。これにより、意図しない要素同士の組み合わせによる誤マッチを防げます。
  • $gt / $lt:それぞれ「指定した値より大きい」「指定した値より小さい」を表す比較演算子です。両者を組み合わせることで範囲検索が実現できます。
  • $match:集計パイプライン(aggregate)内でドキュメントをフィルタリングするためのステージです。

なお、集計パイプラインを使わず、シンプルに find() メソッドでも同じ条件指定が可能です。用途に応じて使い分けるとよいでしょう。

db.demo341.find({
  productDetails: {
    $elemMatch: {
      "ProductPrice.Price": { $gt: 600, $lt: 900 }
    }
  }
}).pretty();
  1. MongoDBでオブジェクトの配列内の複数条件に一致するドキュメントを検索する方法($andと$regex活用)

    MongoDBでオブジェクト(サブドキュメント)の配列内から、複数の条件を同時に満たすドキュメントを検索したい場合は、$and演算子と$regex演算子、さらに$elemMatchを組み合わせるのが効果的です。$andは、1つ以上の式からなる配列に対して論理AND演算を実行し、配列内のすべての条件を満たすドキュメントだけを選択します。また、$elemMatchを使うことで、配列内の同一要素が複数条件を満たすかどうかを正確に判定できます。サンプルコレクションの作成まず、検証用のコレクションを作成してドキュメントを挿入してみましょう。> db.demo525.insertOne({detai

  2. MongoDBで配列をクエリして特定の値を取得する方法

    配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ...    { ...        "details": [ ...            { ...                "