MongoDBでフィルタリングされたサブドキュメントを含むドキュメントを返す方法
MongoDBで、配列内のサブドキュメントを条件に基づいて絞り込んだ結果を取得したい場合には、集計パイプライン(aggregate())の中で $project を使用し、さらにその内部で $filter 演算子を組み合わせます。本記事では、実際のコード例を通じてその手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、insertOne() メソッドを使って2件のドキュメントを挿入しています。各ドキュメントには「details」という配列フィールドがあり、その中に商品名と価格を持つサブドキュメントが格納されています。
> db.demo457.insertOne(
... {
... _id: 101,
... details: [
... { ProductName:"Product-1" , ProductPrice:90 },
... { ProductName:"Product-2" , ProductPrice:190 }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }
>
> db.demo457.insertOne(
... {
... _id: 102,
... details: [
... { ProductName:"Product-3" , ProductPrice:150},
... { ProductName:"Product-4" , ProductPrice:360 }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 102 }
2. コレクション内の全ドキュメントを表示する
find() メソッドを使うと、コレクション内のすべてのドキュメントを確認できます。
> db.demo457.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : 101, "details" : [ { "ProductName" : "Product-1", "ProductPrice" : 90 }, { "ProductName"
: "Product-2", "ProductPrice" : 190 } ] }
{ "_id" : 102, "details" : [ { "ProductName" : "Product-3", "ProductPrice" : 150 }, {
"ProductName" : "Product-4", "ProductPrice" : 360 } ] }
3. フィルタリングされたサブドキュメントを返すクエリ
ここからが本題です。$filter 演算子を使うと、配列の各要素に対して条件を適用し、条件を満たす要素だけを残した新しい配列を生成できます。以下は、「ProductPrice(商品価格)」が170以上のサブドキュメントのみを抽出する例です。
> db.demo457.aggregate([
... {
... $project: {
... details: {
... $filter: {
... input: "$details",
... as: "output",
... cond: { $gte: [ "$$output.ProductPrice", 170 ] }
... }
... }
... }
... }
... ])
実行結果は以下の通りです。価格が170以上のサブドキュメントだけが残っていることが確認できます。
{ "_id" : 101, "details" : [ { "ProductName" : "Product-2", "ProductPrice" : 190 } ] }
{ "_id" : 102, "details" : [ { "ProductName" : "Product-4", "ProductPrice" : 360 } ] }
$filter演算子の主なパラメータ
- input: フィルタリングの対象となる配列を指定します。ここでは「$details」フィールドを対象としています。
- as: 配列の各要素を参照するための変数名を定義します。ここでは「output」という名前を使用しています。
- cond: 各要素が満たすべき条件を指定します。変数を参照する際は「$$output.ProductPrice」のように「$$」を付けます。この例では比較演算子
$gte(以上)を使い、価格が170以上の要素のみを抽出しています。
まとめ
MongoDBでネストされた配列(サブドキュメント)を条件に基づいて絞り込みたい場合は、aggregate() の $project ステージ内で $filter を使うのが基本的なアプローチです。通常の find() のプロジェクションでは配列全体しか取得できませんが、$filter を活用すれば、条件に合致する要素だけを柔軟かつ効率的に取り出すことができます。
-
JavaScriptでCookieを読み取る方法を解説!サンプルコード付き
JavaScriptでは、document.cookieプロパティを使用することで、ブラウザに保存されているCookieを簡単に読み取ることができます。本記事では、実際に動作するサンプルコードをもとに、Cookieの読み取り方法をわかりやすく解説します。 注意:このサンプルを実行するには、ローカルサーバー環境が必要です。HTMLファイルを直接ブラウザで開いた場合、Cookieが正しく機能しないことがあります。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta charset=
-
mongoコマンドでMongoDBシェルを起動する方法
MongoDBシェルの起動方法MongoDBのシェル(対話型インターフェース)を起動するには、mongo コマンドを使用します。mongosではなく、クライアント用のシェルである mongo コマンドを実行する点に注意してください。基本構文> mongo起動手順まず、コマンドプロンプト(Windowsの場合はcmd)を開き、MongoDBがインストールされているbinディレクトリへ移動します。以下のようなパスになります。cd C:\Program Files\MongoDB\Server\<バージョン>\binbinディレクトリに移動したら、次のコマンドを入力してMongoD