MongoDBで埋め込み配列(リスト)内の特定の値より大きいドキュメントを取得する方法
MongoDBでは、埋め込み配列(ネストされたドキュメントのリスト)に含まれるフィールドに対して条件を指定し、特定の値より大きい値を持つドキュメントだけを抽出できます。これを実現するには、比較演算子 $gt(greater than)を find() メソッドと組み合わせて使用します。
この記事では、実際のコード例を通して、埋め込み配列内の「Score」フィールドが89より大きいドキュメントを取得する手順を解説します。
1. サンプルコレクションの作成
まず、insertOne() メソッドを使って、埋め込み配列を持つドキュメントを含むコレクションを作成します。
> db.demo317.insertOne(
... {'id':101,
... 'details':[{'Score':78,Name:"Chris"},
... {'Score':88,Name:"David"}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50e69cf8647eb59e562060")
}
> db.demo317.insertOne(
... {'id':102,
... 'details':[{'Score':90,Name:"Chris"},
... {'Score':91,Name:"David"}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50e6adf8647eb59e562061")
}ここでは、各ドキュメントが「id」フィールドと、「Score」(スコア)と「Name」(名前)を持つ「details」という埋め込み配列を含む構造になっています。
2. コレクション内の全ドキュメントを表示する
作成したコレクションの内容を確認するために、find() メソッドですべてのドキュメントを表示してみましょう。
> db.demo317.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e50e69cf8647eb59e562060"), "id" : 101, "details" : [ { "Score" : 78, "Name" : "Chris" }, { "Score" : 88, "Name" : "David" } ] }
{ "_id" : ObjectId("5e50e6adf8647eb59e562061"), "id" : 102, "details" : [ { "Score" : 90, "Name" : "Chris" }, { "Score" : 91, "Name" : "David" } ] }3. $gt演算子で埋め込み配列内の値を検索する
それでは本題です。埋め込み配列内のフィールドに対して $gt を使うには、「配列名.フィールド名」というドット記法でパスを指定します。
以下のクエリは、「details.Score」が89より大きいドキュメントを取得します。
> db.demo317.find({"details.Score" :{"$gt": 89}});実行結果は次のとおりです。
{ "_id" : ObjectId("5e50e6adf8647eb59e562061"), "id" : 102, "details" : [ { "Score" : 90, "Name" : "Chris" }, { "Score" : 91, "Name" : "David" } ] }結果のポイント
出力を見ると、id: 102 のドキュメントのみが返されていることがわかります。これは、details 配列内の Score 値(90 と 91)がどちらも89より大きいためです。一方、id: 101 のドキュメントは Score が78と88であり、条件を満たさないため除外されました。
なお、MongoDBでは配列内の少なくとも1つの要素が条件を満たしていれば、そのドキュメント全体がマッチ対象になります。たとえば Score が「85 と 95」のようなドキュメントがあれば、$gt: 89 の条件でもヒットします。すべての要素が条件を満たすことを保証したい場合は、$elemMatch や集計パイプライン($filter など)の活用も検討するとよいでしょう。
-
MongoDBドキュメントから特定の値をフィルタリングする方法
MongoDBドキュメントから特定の値をフィルタリングする方法MongoDBでドキュメント内の配列から特定の値を抽出したい場合は、集計パイプラインで $filter を使用します。この記事では、実際にコレクションを作成し、特定の条件に一致する要素だけをフィルタリングする手順を、サンプルコードとともに解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、配列フィールドを含むドキュメントを持つコレクションを作成します。 db.demo751.insertOne( ... { ... _id: 101, ... details: [
-
MySQLでセミコロン区切りの値リストから特定のレコードを検索する方法
MySQLでは、セミコロン(;)で区切られた値が1つのカラムに格納されている場合でも、FIND_IN_SET() 関数と REPLACE() 関数を組み合わせることで、特定の値を含むレコードを簡単に検索できます。FIND_IN_SET()はカンマ区切りの文字列を対象とするため、まずREPLACE()でセミコロンをカンマに変換するのがポイントです。ここでは、実際にテーブルを作成し、データを挿入して検索を行う手順を順番に解説します。1. テーブルの作成まずはサンプル用のテーブルを作成します。mysql> create table DemoTable ( Id int NOT NULL