MongoDBでサブドキュメント配列のn番目の要素(変数インデックス)をクエリする方法
MongoDBでは、サブドキュメント(埋め込みドキュメント)の配列から、変数で指定したインデックス位置にあるn番目の要素を条件として検索したいケースがあります。そのような場合には、$letと$exprを組み合わせて使用します。
$letは一時的な変数を定義するための演算子で、$exprは集計式(aggregation expression)をクエリ内で使えるようにするためのものです。この2つを組み合わせることで、配列の任意の位置にある要素にアクセスし、その値を比較条件として利用できます。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。
> db.demo72.insertOne(
... {
... StudentDetails:[
... {
... Name: "Chris",
... Age: 21
... },
... {
... Name: "David",
... Age: 23
... },
... {
... Name: "Bob",
... Age: 20
... },
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e29b4ad71bf0181ecc42269")
}コレクション内の全ドキュメントを表示
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo72.find().pretty();
このクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e29b4ad71bf0181ecc42269"),
"StudentDetails" : [
{
"Name" : "Chris",
"Age" : 21
},
{
"Name" : "David",
"Age" : 23
},
{
"Name" : "Bob",
"Age" : 20
}
]
}n番目の要素に対するクエリの実行
それでは、サブドキュメント配列のn番目の要素(ここではインデックス1、つまり2番目の要素)を対象としたクエリを見ていきましょう。
> db.demo72.find({
... $expr: {
... $let: {
... vars: { fst: { $arrayElemAt: [ "$StudentDetails", 1 ] } },
... in: { $eq: [ "$$fst.Name", "David" ] }
... }
... }
... })このクエリのポイントは以下の通りです。
- $arrayElemAt: 配列とインデックス番号を指定することで、その位置にある要素を取得します。インデックスは0から始まるため、「1」を指定すると2番目の要素を参照します。
- $let の vars: 取得した要素を一時変数「fst」に格納しています。
- $eq: 一時変数「fst」のNameフィールド($$fst.Name)が「David」と一致するかどうかを判定しています。
このクエリを実行すると、次のような結果が出力されます。
{
"_id" : ObjectId("5e29b4ad71bf0181ecc42269"), "StudentDetails" : [
{ "Name" : "Chris", "Age" : 21 }, { "Name" : "David", "Age" : 23 }, { "Name" : "Bob", "Age" : 20 }
]
}このように、$letと$exprを組み合わせれば、配列の特定の位置にあるサブドキュメントのフィールド値を柔軟に条件指定できます。インデックス部分を別の変数に置き換えれば、動的にn番目の要素を検索することも可能です。
-
MongoDBで配列の要素を1つだけ取得する方法|$slice演算子の使い方
MongoDBの$sliceで配列の要素を1つだけ取得する配列から特定の件数の要素だけを取り出したい場合、MongoDBでは$slice演算子を使用します。$sliceはプロジェクション演算子の一種で、指定した件数分の配列要素のみを返すことができます。ここでは、実際にコレクションを作成し、$sliceを使って配列の先頭1件だけを取得する手順を順番に見ていきましょう。サンプルデータの作成まず、insertOne()メソッドを使ってドキュメントをコレクションに挿入します。> db.demo579.insertOne( ... { ... _id : 101, ...
-
MongoDBで配列要素の平均値を取得するクエリの書き方
MongoDBで配列内の数値の平均を求める方法MongoDBでは、配列に格納された複数の数値から平均値を算出したいケースがよくあります。例えば、1つのドキュメントの中に複数の点数(Marks)が配列として保存されている場合、その平均点を取得したいことがあります。このような場合、集計パイプライン(aggregation)と$avg演算子を組み合わせることで、簡単に平均値を求めることができます。$avgは、指定したフィールド(配列の場合はその全要素)の数値の平均を自動的に計算してくれる便利な演算子です。以下、具体的な手順を見ていきましょう。1. コレクションを作成し、ドキュメントを挿入するまず、i