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

【MongoDB】$addFieldsで新しいフィールドを追加し、価格を特定の数値で割った結果を連結する方法


MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。本記事では、ネストされた配列内の商品価格(ProductPrice)を特定の数値で割り、その結果を文字列として連結して新しいフィールドに格納する方法を、サンプルコードとともに解説します。

サンプルコレクションの作成

まず、insertOne()メソッドを使用して、ドキュメントを含むコレクションを作成します。

> db.demo719.insertOne(
...     {
...         "Number":"7374644",
...         "details" : {
...             "otherDetails" : [
...                 {
...                     "ProductId" :"102",
...                     "ProductPrice" : NumberInt(500)
...                 },
...                 {
...                     "ProductId" :"103",
...                     "ProductPrice" : NumberInt(2000)
...                 }
...             ]
...         }
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5eaae56c43417811278f5882")
}

作成したドキュメントの確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

> db.demo719.find();

上記のコマンドを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5eaae56c43417811278f5882"), "Number" : "7374644", "details" : { "otherDetails" : [ { "ProductId" : "102", "ProductPrice" : 500 }, { "ProductId" : "103", "ProductPrice" : 2000 } ] } }

新しいフィールドを追加し、価格を割った結果を連結するクエリ

次のクエリでは、$addFieldsで「productPriceList」という新しいフィールドを追加し、各商品価格を5で割った値を文字列に変換したうえで連結しています。

処理の流れは以下の通りです。

  • $map:details.otherDetails.ProductPrice の各要素を取り出し、$divideで5で割った後、$toStringで文字列に変換します。
  • $reduce:変換された各値を初期値 "" から順に$concatで連結し、区切り文字として改行コード(\n)を挿入します。
  • $project:_idを除外し、NumberとproductPriceListのみを出力します。
> db.demo719.aggregate([
...     {
...        $addFields:{
...           productPriceList: {
...              $reduce: {
...                 input: {
...                    $map: {
...                       input: "$details.otherDetails.ProductPrice",
...                       in: { $toString: { $divide: ["$$this", 5] } }
...                    }
...                 },
...                 initialValue: "",
...                 in: { $concat: ["$$value", "$$this", " \n "] }
...              }
...           }
...        }
...     },
...     {
...        $project: {
...           _id: 0,
...           Number:1,
...           productPriceList:1
...        }
...     }
... ])

実行結果

このクエリを実行すると、次のような出力が得られます。

{ "Number" : "7374644", "productPriceList" : "100 \n 400 \n " }

出力結果を見ると、500÷5=100、2000÷5=400 がそれぞれ文字列に変換され、改行コードで連結された値が新しいフィールド「productPriceList」に格納されていることがわかります。このように$addFieldsと$map、$reduceを組み合わせることで、ネストされた配列の数値を柔軟に加工し、整形したテキストとして新しいフィールドに追加できます。


  1. 【MongoDB】$addFieldsで新しいフィールドを追加し、価格を特定の数値で割った結果を連結する方法

    MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。本記事では、ネストされた配列内の商品価格(ProductPrice)を特定の数値で割り、その結果を文字列として連結して新しいフィールドに格納する方法を、サンプルコードとともに解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ドキュメントを含むコレクションを作成します。 > db.demo719.insertOne( ... { ... Number:7374644, ... de

  2. MongoDBで特定の数値より大きいフィールド値を持つドキュメントを照合して取得する方法

    MongoDBでドキュメントを照合(マッチング)するには、集計パイプライン(aggregate)内で $match を使用します。さらに、特定の数値より大きい値を条件にしたい場合は、比較演算子の $gt(greater than)を組み合わせます。この記事では、実際にコレクションを作成し、$sort や $limit と組み合わせながら、条件に一致するドキュメントを取得する手順を解説します。1. サンプルコレクションの作成まずは insertOne() メソッドを使って、ドキュメントを含むコレクションを作成しましょう。> db.demo730.insertOne({Name : Chri