MongoDBで配列内のサブ要素をクエリする方法|位置演算子$の使い方を解説
MongoDBで配列の中に格納されたサブ要素(ネストされたドキュメント)をクエリしたい場合、位置演算子「$」を活用すると便利です。この記事では、実際のコード例を交えながら、条件に一致するサブ要素だけを抽出する方法をわかりやすく解説します。
テスト用コレクションの作成
まずは動作確認のためのコレクションを作成しましょう。以下の例では、insertOne()メソッドを使って、クライアント名と婚姻ステータスを持つ配列を含むドキュメントを挿入しています。
> db.subElementQueryingDemo.insertOne(
... {
... "ClientName":"Chris",
... "Status": [ { "isMarried": true }, { "isMarried": false } ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf28c9dceb9a92e6aa1953")
}これで、「Chris」というクライアント名と、true / false の2つのisMarriedフィールドを持つStatus配列を含むドキュメントが登録されました。
登録済みドキュメントの確認
続いて、find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。
> db.subElementQueryingDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5ccf28c9dceb9a92e6aa1953"),
"ClientName" : "Chris",
"Status" : [
{
"isMarried" : true
},
{
"isMarried" : false
}
]
}位置演算子$でサブ要素をクエリする
それでは本題です。MongoDBで配列内のサブ要素をクエリするには、検索条件と射影(projection)の両方で位置演算子$を組み合わせます。以下の例では、「isMarriedがtrueである要素」のみをStatus配列から取り出しています。
> db.subElementQueryingDemo.find({ "Status.isMarried": true }, {ClientName: 1, 'Status.$': 1}).pretty();実行結果は次のとおりです。
{
"_id" : ObjectId("5ccf28c9dceb9a92e6aa1953"),
"ClientName" : "Chris",
"Status" : [
{
"isMarried" : true
}
]
}ポイントのまとめ
このクエリの仕組みを整理すると、以下のようになります。
- 第1引数(検索条件):{ "Status.isMarried": true } により、配列内でisMarriedがtrueの要素を対象に指定します。
- 第2引数(射影):{ ClientName: 1, 'Status.$': 1 } により、ClientNameフィールドと、条件に一致した配列要素のみを返すよう指定します。
位置演算子$は、クエリ条件に最初に一致した配列要素のインデックスを自動的に参照してくれるため、インデックス番号を明示的に指定することなく、必要なサブ要素だけをスマートに取得できます。配列内の特定要素を頻繁に扱うアプリケーションでは、ぜひ活用してみてください。
-
MongoDBの$push演算子を使って配列に要素を追加する方法
MongoDBの$push演算子とはMongoDBの$push演算子は、ドキュメント内の配列フィールドに対して新しい要素を追加するための更新演算子です。既存の配列の末尾に値を追加できるため、リスト形式のデータを扱う際に非常に便利です。この記事では、実際のコード例を通して、$push演算子の基本的な使い方を解説します。1. コレクションとドキュメントを作成するまず、insertOne()メソッドを使用して、コレクションにドキュメントを挿入します。ここでは「Subjects」という配列フィールドを持つ2つのドキュメントを作成します。> db.demo738.insertOne({Subjec
-
MongoDBでオブジェクト配列内の特定のネストされたドキュメントをクエリする方法
MongoDBでオブジェクトの配列からネストされたドキュメントを抽出する オブジェクトの配列に格納されたネストされたドキュメントを条件付きで検索したい場合、find()メソッドに$elemMatch演算子を組み合わせることで、指定した条件に一致する要素だけを取り出すことができます。 ここでは、「StudentAge」フィールドを持つ学生情報だけを配列から抽出する例を見ていきましょう。 1. サンプルコレクションの作成 まず、ドキュメントを挿入してコレクションを作成します。このコレクションには、学生情報がオブジェクトの配列として格納されています。 > db.demo763.insertO