MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

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引数の数値を変更すれば、取得する件数も自由に調整可能です。

  1. JavaScriptのslice()メソッドとは?配列から要素を抽出する方法を実例付きで解説

    slice()メソッドの基本JavaScriptのslice()メソッドは、配列の中から指定した範囲の要素を選び出し、新しい配列として返すメソッドです。元の配列は変更されずそのまま残るため、安全に部分的なデータを取り出したい場合に活用できます。基本構文array.slice(start, end)start:抽出を開始する位置を示す整数(インデックス番号)です。end:抽出を終了する位置を示す整数で、この位置にある要素自体は結果に含まれません。それでは、実際にslice()メソッドをJavaScriptで使ってみましょう。例1:配列の一部を切り取って表示する<!DOCTYPE html&

  2. MongoDBアグリゲーションで配列内の要素サブセットを合計する方法

    MongoDBのアグリゲーションパイプラインを使用して、配列内の一部の要素(サブセット)を合計したい場合があります。そんなときは、$first演算子と$sum演算子を組み合わせることで実現できます。この記事では、実際のコレクションを作成しながら、具体的な手順をサンプルコード付きでわかりやすく解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、数値の配列「Values」を持つドキュメントをinsertOne()メソッドで挿入しています。> db.demo610.insertOne({Values:[10,20,30,40,50]}