MongoDBで配列の最後のオブジェクトをクエリする方法
MongoDBで配列の最後のオブジェクトをクエリする方法
MongoDBでは、配列内の最後のオブジェクトを条件にドキュメントを検索したいケースがよくあります。そのような場合には、集計パイプライン(aggregate())と $arrayElemAt 演算子を組み合わせるのが効果的です。$arrayElemAt のインデックスに -1 を指定すると、配列の末尾にある要素を簡単に参照できます。
ここからは、実際のコレクションを作成しながら手順を見ていきましょう。
1. サンプルコレクションの作成
まず、insertOne() メソッドを使ってドキュメントを挿入し、コレクションを作成します。
> db.demo103.insertOne( { "Details" : [
{ "StudentId" : 101, "Details" : "MongoDB" },
{"StudentId" : 102, "Details" : "MySQL" },
{ "StudentId" : 103, "Details" : "Java" }
], "Details1" : [ { "StudentId" : 104, "Number" : 3 } ] } );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2ed2dd9fd5fd66da21446e")
}2. ドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo103.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e2ed2dd9fd5fd66da21446e"), "Details" : [ { "StudentId" : 101, "Details" : "MongoDB" }, { "StudentId" : 102, "Details" : "MySQL" }, { "StudentId" : 103, "Details" : "Java" } ], "Details1" : [ { "StudentId" : 104, "Number" : 3 } ] }3. 配列の最後のオブジェクトをクエリする
それでは、配列「Details」の最後のオブジェクトを対象にクエリを実行してみましょう。ポイントは次の2つのステージの組み合わせです。
- $project:
$arrayElemAtを使い、配列の最後の要素(インデックス-1)を取り出す - $match:取り出した要素の値(ここでは
StudentId: 103)でドキュメントを絞り込む
> db.demo103.aggregate([ { $project: { Details1: 1, Details: {$arrayElemAt: ["$Details", -1]} } }, { $match: {"Details.StudentId": 103} } ])実行結果は次のとおりです。配列の最後の要素である StudentId: 103 のオブジェクトだけが抽出されていることがわかります。
{ "_id" : ObjectId("5e2ed2dd9fd5fd66da21446e"), "Details1" : [ { "StudentId" : 104, "Number" : 3 } ], "Details" : { "StudentId" : 103, "Details" : "Java" } }ポイントまとめ
$arrayElemAtの第2引数に-1を指定すると、配列の最後の要素を取得できる$projectで必要なフィールドを整形してから$matchで絞り込むのが基本的な流れaggregate()を使えば、通常のfind()では難しい配列要素単位の柔軟な検索が可能になる
-
MongoDBでサブドキュメントの配列をクエリする方法
MongoDBでサブドキュメントの配列をクエリするには、集計パイプラインの$unwindを使用します。$unwindは、配列フィールドを展開し、配列の各要素ごとに個別のドキュメントを生成するステージです。これにより、配列内のサブドキュメントを個別にフィルタリングできるようになります。ここでは、大学の情報を含むコレクションを作成し、その中から特定の条件に一致するサブドキュメントを抽出する手順を解説します。コレクションの作成まず、insertOne()メソッドを使って、サブドキュメントの配列を含むドキュメントを挿入しましょう。> db.demo499.insertOne({... "
-
MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法
MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id: