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

MongoDBで整数配列を条件としてドキュメントを検索する方法

MongoDBで整数配列を使ってドキュメントを検索する方法

MongoDBでは、$where演算子を活用することで、整数型の配列フィールドを持つドキュメントを柔軟に検索できます。本記事では、サンプルコレクションの作成から、配列の長さを条件とした検索、特定の値が含まれるドキュメントの絞り込みまで、具体的な手順を順番に解説します。

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

まず、insertOne()メソッドを使用して、学生の名前(StudentFirstName)とスコアの整数配列(StudentScores)を格納したドキュメントをいくつか挿入します。

> db.searchDocumentArrayIntegerDemo.insertOne({"StudentFirstName":"John","StudentScores":[45,78,89,90]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2a219345990cee87fd88c")
}
> db.searchDocumentArrayIntegerDemo.insertOne({"StudentFirstName":"Larry","StudentScores":[45,43,34,33]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2a22a345990cee87fd88d")
}
> db.searchDocumentArrayIntegerDemo.insertOne({"StudentFirstName":"Chris","StudentScores":[]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2a23c345990cee87fd88e")
}
> db.searchDocumentArrayIntegerDemo.insertOne({"StudentFirstName":"David","StudentScores":[99]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2a24d345990cee87fd88f")
}

ステップ2:登録済みドキュメントの確認

find()メソッドを実行すれば、コレクション内のすべてのドキュメントを表示できます。読みやすさを向上させるために、pretty()を併用するとよいでしょう。

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

このクエリを実行すると、次のような結果が出力されます。

{
   "_id" : ObjectId("5cd2a219345990cee87fd88c"),
   "StudentFirstName" : "John",
   "StudentScores" : [
      45,
      78,
      89,
      90
   ]
}
{
   "_id" : ObjectId("5cd2a22a345990cee87fd88d"),
   "StudentFirstName" : "Larry",
   "StudentScores" : [
      45,
      43,
      34,
      33
   ]
}
{
   "_id" : ObjectId("5cd2a23c345990cee87fd88e"),
   "StudentFirstName" : "Chris",
   "StudentScores" : [ ]
}
{
   "_id" : ObjectId("5cd2a24d345990cee87fd88f"),
   "StudentFirstName" : "David",
   "StudentScores" : [
      99
   ]
}

ケース1:配列に1つ以上の値が含まれるドキュメントを検索する

$where演算子とJavaScript式を組み合わせると、「配列の長さが1以上である」という条件でドキュメントを抽出できます。

> db.searchDocumentArrayIntegerDemo.find({ $where: "this.StudentScores.length >= 1" } );

実行結果は以下の通りです。空の配列を持つ「Chris」のドキュメントだけが除外され、残りの3件が出力されていることがわかります。

{ "_id" : ObjectId("5cd2a219345990cee87fd88c"), "StudentFirstName" : "John", "StudentScores" : [ 45, 78, 89, 90 ] }
{ "_id" : ObjectId("5cd2a22a345990cee87fd88d"), "StudentFirstName" : "Larry", "StudentScores" : [ 45, 43, 34, 33 ] }
{ "_id" : ObjectId("5cd2a24d345990cee87fd88f"), "StudentFirstName" : "David", "StudentScores" : [ 99 ] }

ケース2:すべてのドキュメントに共通する値が含まれる配列を検索する

配列内に特定の値(ここでは「45」)が存在するかどうかを調べたい場合は、フィールド名に対してその値を直接指定します。さらに、第2引数にプロジェクション { StudentScores: 1 } を渡すことで、必要なフィールドだけを表示でき、結果がすっきりします。

> db.searchDocumentArrayIntegerDemo.find({StudentScores: 45}, {StudentScores:1});

実行結果は以下の通りです。「John」と「Larry」のスコア配列には「45」が含まれているため、該当する2件のみが出力されます。

{ "_id" : ObjectId("5cd2a219345990cee87fd88c"), "StudentScores" : [ 45, 78, 89, 90 ] }
{ "_id" : ObjectId("5cd2a22a345990cee87fd88d"), "StudentScores" : [ 45, 43, 34, 33 ] }

補足:$expr演算子という代替手段

MongoDB 3.6以降では、$whereの代わりに$expr演算子を使用することも可能です。$exprは集計式(aggregation expression)をサポートしており、インデックスを利用できるケースがあるため、大規模なコレクションではパフォーマンス面で有利になることがあります。例えば、配列サイズが1以上であることを判定するクエリは、以下のように書き換えられます。

> db.searchDocumentArrayIntegerDemo.find({ $expr: { $gte: [ { $size: "$StudentScores" }, 1 ] } });

用途に応じて$where$exprを使い分けることで、より効率的かつ可読性の高いクエリを実現できます。

  1. MongoDBの配列に追加・連結するには?$concatArrays演算子の使い方

    MongoDBで配列を追加・連結するには?MongoDBで配列に別の配列を追加(連結)したい場合には、集計(アグリゲーション)フレームワークの$concatArrays演算子を使用します。$concatArraysは、複数の配列を1つに結合した新しい配列を返す演算子で、MongoDB 3.2以降で利用可能です。この記事では、実際にコレクションを作成し、「FirstName」と「LastName」という2つの配列フィールドを$concatArraysで連結するまでの手順を、サンプルコードとともに解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってドキュメントを

  2. MongoDBで配列フィールドを使ってドキュメントをフィルタリングする方法($elemMatch演算子の使い方)

    MongoDBで配列内の要素に基づいてドキュメントをフィルタリングしたい場合、$elemMatch 演算子を使用します。$elemMatch は、指定した条件を満たす要素を少なくとも1つ含む配列フィールドを持つドキュメントを照合するための演算子です。この記事では、実際にコレクションを作成し、$elemMatch を使って配列条件でドキュメントを絞り込む手順を解説します。サンプルコレクションの作成まず、テスト用のコレクションにドキュメントを挿入してみましょう。ここでは、学生の名前と点数(Marks)を持つ details 配列を含むドキュメントを作成します。> db.demo453.ins