MongoDBのアグリゲーションで配列内の配列(ネストされた配列)をスライスする方法
MongoDBでネストされた配列をスライスするには
MongoDBで配列の中に格納された配列(ネストされた配列)をスライスするには、aggregate()メソッドを使用します。アグリゲーションパイプラインの中で$slice演算子を組み合わせることで、入れ子構造になった配列から必要な要素だけを取り出せます。
1. サンプルコレクションの作成
まずは、ドキュメントを含むコレクションを作成しましょう。以下のようにinsertOne()メソッドを実行します。
> db.demo111.insertOne(
... {
... "_id" : 101,
... "Name" : "Chris",
... "Details" : [
... {
... "_id" : 101,
... "Score" : 78,
... "Subjects" : [
... {
... "_id" : "10001",
... "SubjectName" : "MySQL"
... },
... {
... "_id" : "10003",
... "SubjectName" : "MongoDB"
... }
... ]
... },
... {
... "_id" : 102,
... "Score" : 87,
... "Subjects" : [
... {
... "_id" : "10004",
... "SubjectName" : "Java"
... }
... ]
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }
2. 登録済みドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo111.find();
上記のコマンドを実行すると、次のような出力が得られます。
{
&nbs p"_id" : 101, "Name" : "Chris", "Details" : [
{ "_id" : 101, "Score" : 78, "Subjects" : [ { "_id" : "10001", "SubjectName" : "MySQL" },
{ "_id" : "10003", "SubjectName" : "MongoDB" } ] },
{ "_id" : 102, "Score" : 87, "Subjects" : [ { "_id" : "10004", "SubjectName" : "Java" } ] }
]
}3. 配列内の配列をスライスするクエリ
ここからが本題です。ネストされた配列をスライスするには、$addFieldsステージで$map演算子を使ってDetailsフィールドを再構築し、その処理の中で$slice演算子を適用します。以下がそのクエリです。
> db.demo111.aggregate([
... { "$addFields": {
... "Details": {
... "$map": {
... "input": "$Details",
... "as": "out",
... "in": {
... "_id": "$$out._id",
... "Score": "$$out.Score",
... "Subjects": { "$slice": [ "$$out.Subjects", 1 ] }
... }
... }
... }
... }}
... ])
このクエリを実行すると、以下のような出力が得られます。
{
&nbs p"_id" : 101, "Name" : "Chris", "Details" : [
{ "_id" : 101, "Score" : 78, "Subjects" : [ { "_id" : "10001", "SubjectName" : "MySQL" } ] },
{ "_id" : 102, "Score" : 87, "Subjects" : [ { "_id" : "10004", "SubjectName" : "Java" } ] }
]
}4. クエリのポイント解説
実行結果を見ると、各Details要素のSubjects配列から最初の1件だけが抽出されていることがわかります。これは$slice: [ "$$out.Subjects", 1 ]の部分が、内側の配列の先頭から1つの要素のみを取得しているためです。
このように$mapと$sliceを組み合わせることで、ドキュメント全体を書き換えることなく、ネストされた配列の一部だけを効率的に取得できます。$sliceの第2引数の数値を変更すれば、取得する件数も自由に調整可能です。
-
JavaScriptのslice()メソッドとは?配列から要素を抽出する方法を実例付きで解説
slice()メソッドの基本JavaScriptのslice()メソッドは、配列の中から指定した範囲の要素を選び出し、新しい配列として返すメソッドです。元の配列は変更されずそのまま残るため、安全に部分的なデータを取り出したい場合に活用できます。基本構文array.slice(start, end)start:抽出を開始する位置を示す整数(インデックス番号)です。end:抽出を終了する位置を示す整数で、この位置にある要素自体は結果に含まれません。それでは、実際にslice()メソッドをJavaScriptで使ってみましょう。例1:配列の一部を切り取って表示する<!DOCTYPE html&
-
MongoDBアグリゲーションで配列内の要素サブセットを合計する方法
MongoDBのアグリゲーションパイプラインを使用して、配列内の一部の要素(サブセット)を合計したい場合があります。そんなときは、$first演算子と$sum演算子を組み合わせることで実現できます。この記事では、実際のコレクションを作成しながら、具体的な手順をサンプルコード付きでわかりやすく解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、数値の配列「Values」を持つドキュメントをinsertOne()メソッドで挿入しています。> db.demo610.insertOne({Values:[10,20,30,40,50]}