AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

集計パイプラインの更新

集計パイプライン を使用して更新操作を実行します。これらのパイプラインは、次の場所でビルドおよび実行できます。

更新用の集計パイプラインは、次のステージをサポートしています。

集計パイプラインにより、次のような表現的な更新が可能になります。

  • 現在のフィールド値に基づく条件付き更新

  • 他のフィールドからフィールド値を設定

注意

フィールド値のドル記号

集計パイプラインを使用する場合は、ユーザー入力から渡される文字列、またはデータの解析から動的に作成された文字列をクリーンアップします。いずれかのフィールド値がリテラル文字列値で、ドル記号で始まる場合、その値を $literal 集計演算子に渡す必要があります。次の例では、集計パイプライン$set と$literal 演算子を使用して、ドキュメントを で更新し、_id 1costフィールドが$27 になる方法を示します。

db.inventory.updateOne( { _id: 1 }, [ { $set: { "cost": { $literal: "$27" } } } ] )

You can build aggregation pipelines to perform updates in the MongoDB Atlas UI. Requires Project Data Access Read Only role or higher.

1
  1. コレクションのデータベースを選択します。

    メイン パネルと左側の Namespaces には、データベース内のコレクションが一覧表示されます。

  2. コレクションを選択します。

    左側またはメインパネルでコレクションを選択します。メイン パネルには、 Find 、 Indexes 、 Aggregationのビューが表示されます。

  3. 集計ビューを選択します。

    Aggregation ビューを初めて開くと、Atlas では空の集計パイプラインが表示されます。

2
  1. 集計ステージを選択します。

    左下のパネルにあるSelectドロップダウン メニューから集計ステージを選択します。

    ドロップダウン メニューの右側にあるトグルで、ステージが有効かどうかを指定します。

    集計を使用して更新を実行するには、次のいずれかのステージを使用します。

  2. ステージを構成する

    Fill in your stage with the appropriate values. If Comment Mode is enabled, the pipeline builder provides syntactic guidelines for your selected stage.

    ステージを変更すると、Atlasは現在のステージの結果に基づいて右側のプレビュー ドキュメントが更新されます。

    集計ステージに含めることができる内容の例については、このページの例を参照してください。

    Add stages as needed. For more information on creating aggregation pipelines in Atlas, refer to Create an Aggregation Pipeline.

3
  1. [言語にエクスポート] をクリックします。

    このボタンは、パイプラインビルダの上部にあります。

  2. 希望のエクスポート言語を選択します。

    Export Pipeline Toメニューで、目的の言語を選択します。

    左側のMy Pipelineペインには、MongoDB Shell 構文でパイプラインが表示されます。これを直接コピーして、MongoDB Shell でパイプラインを実行することができます。

    右側のペインには、選択した言語でパイプラインが表示されます。ご希望の言語を選択します。

  3. 必要に応じて、オプションを選択します。

    (任意):選択した言語に必要なインポート ステートメントを含めるには、Include Import Statements オプションをオンにします。

    (オプション):Include Driver Syntax オプションにチェックを入れると、次のようなドライバー固有のコードが含まれます。

    • クライアントを初期化

    • データベースとコレクションの指定

    • 集計操作の実行

  4. パイプラインのコピー

    パイプラインの右上にある Copy ボタンをクリックして、選択した言語のパイプラインをクリップボードにコピーします。コピーしたパイプラインをアプリケーションに貼り付けます。

次の例は、集計パイプライン ステージ $set、$replaceRoot、および$addFields を使用して更新を実行する方法を示しています。

students コレクションを次のように作成します。

db.students.insertMany( [
{ _id: 1, test1: 95, test2: 92, test3: 90, modified: new Date("01/05/2020") },
{ _id: 2, test1: 98, test2: 100, test3: 102, modified: new Date("01/05/2020") },
{ _id: 3, test1: 95, test2: 110, modified: new Date("01/04/2020") }
] )

確認するには、コレクションに対してクエリを実行します。

db.students.find()

次のdb.collection.updateOne()操作は、集約パイプラインを使用してドキュメントを_id: 3で更新します。

db.students.updateOne( { _id: 3 }, [ { $set: { "test3": 98, modified: "$$NOW"} } ] )

パイプラインは、ドキュメントに test3 フィールド(その値を 98 に設定)を追加し、modified フィールドを現在の日時に設定する $set ステージで構成されます。この操作では、現在の日時の集計変数 NOW が使用されます。変数にアクセスするには、先頭に $$ を付け、引用符で囲みます。

確認するには、コレクションに対してクエリを実行します。

db.students.find().pretty()

students2 コレクションを次のように作成します。

db.students2.insertMany( [
{ "_id" : 1, quiz1: 8, test2: 100, quiz2: 9, modified: new Date("01/05/2020") },
{ "_id" : 2, quiz2: 5, test1: 80, test2: 89, modified: new Date("01/05/2020") },
] )

確認するには、コレクションに対してクエリを実行します。

db.students2.find()

次の db.collection.updateMany() オペレーションでは、集計パイプラインを使用してドキュメントのフィールドを標準化し(コレクション内のドキュメントには同じフィールドが必要です)、modified フィールドを更新してください。

db.students2.updateMany( {},
[
{ $replaceRoot: { newRoot:
{ $mergeObjects: [ { quiz1: 0, quiz2: 0, test1: 0, test2: 0 }, "$$ROOT" ] }
} },
{ $set: { modified: "$$NOW"} }
]
)

このパイプラインは、以下のように構成されています。

  • quiz1、quiz2 、test1およびtest2フィールドにデフォルト値を設定する$mergeObjects式を使用した$replaceRootステージ。集計変数 ROOT は、現在変更されているドキュメントを参照します。変数にアクセスするには、先頭に$$を付けて引用符で囲みます。現在のドキュメント フィールドがデフォルト値を上書きします。

  • modifiedフィールドを現在の日時で更新する$setステージ。この操作では、現在の日時の集計変数NOWが使用されます。変数にアクセスするには、先頭に$$を付けて引用符で囲みます。

確認するには、コレクションに対してクエリを実行します。

db.students2.find()

students3 コレクションを次のように作成します。

db.students3.insertMany( [
{ "_id" : 1, "tests" : [ 95, 92, 90 ], "modified" : ISODate("2019-01-01T00:00:00Z") },
{ "_id" : 2, "tests" : [ 94, 88, 90 ], "modified" : ISODate("2019-01-01T00:00:00Z") },
{ "_id" : 3, "tests" : [ 70, 75, 82 ], "modified" : ISODate("2019-01-01T00:00:00Z") }
] );

確認するには、コレクションに対してクエリを実行します。

db.students3.find()

次の db.collection.updateMany() オペレーションでは、集計パイプラインを使用して、計算された平均成績とレターグレードでドキュメントを更新します。

db.students3.updateMany(
{ },
[
{ $set: { average : { $trunc: [ { $avg: "$tests" }, 0 ] }, modified: "$$NOW" } },
{ $set: { grade: { $switch: {
branches: [
{ case: { $gte: [ "$average", 90 ] }, then: "A" },
{ case: { $gte: [ "$average", 80 ] }, then: "B" },
{ case: { $gte: [ "$average", 70 ] }, then: "C" },
{ case: { $gte: [ "$average", 60 ] }, then: "D" }
],
default: "F"
} } } }
]
)

このパイプラインは、以下のように構成されています。

  • tests配列エレメントの切り捨てられた平均値を計算し、modified フィールドを現在の DateTime にアップデートする$setステージ。切り捨てられた平均を計算するために、ステージは $avg 式と $trunc 式を使用します。この操作では、現在の日時の集計変数NOWが使用されます。変数にアクセスするには、先頭に$$を付けて引用符で囲みます。

  • average に基づいて$switch式を使用しgradeを追加する$setステージ。

確認するには、コレクションに対してクエリを実行します。

db.students3.find()

students4 コレクションを次のように作成します。

db.students4.insertMany( [
{ "_id" : 1, "quizzes" : [ 4, 6, 7 ] },
{ "_id" : 2, "quizzes" : [ 5 ] },
{ "_id" : 3, "quizzes" : [ 10, 10, 10 ] }
] )

確認するには、コレクションに対してクエリを実行します。

db.students4.find()

次の db.collection.updateOne() オペレーションでは、集計パイプラインを使用して _id: 2 のクイズ得点をドキュメントに追加します。

db.students4.updateOne( { _id: 2 },
[ { $set: { quizzes: { $concatArrays: [ "$quizzes", [ 8, 6 ] ] } } } ]
)

確認するには、コレクションに対してクエリを実行します。

db.students4.find()

摂氏単位の温度を使用して temperaturesコレクションを作成します。

db.temperatures.insertMany( [
{ "_id" : 1, "date" : ISODate("2019-06-23"), "tempsC" : [ 4, 12, 17 ] },
{ "_id" : 2, "date" : ISODate("2019-07-07"), "tempsC" : [ 14, 24, 11 ] },
{ "_id" : 3, "date" : ISODate("2019-10-30"), "tempsC" : [ 18, 6, 8 ] }
] )

確認するには、コレクションに対してクエリを実行します。

db.temperatures.find()

次のdb.collection.updateMany()操作では、集計パイプラインを使用して、対応する華氏温度でドキュメントを更新します。

db.temperatures.updateMany( { },
[
{ $addFields: { "tempsF": {
$map: {
input: "$tempsC",
as: "celsius",
in: { $add: [ { $multiply: ["$$celsius", 9/5 ] }, 32 ] }
}
} } }
]
)

パイプラインは$addFields ステージで構成され、華氏単位の温度を含む新しい配列フィールドtempsF を追加します。tempsC 配列の各摂氏温度を華氏に変換するために、ステージは $map 式および $add 式と $multiply 式を使用します。

確認するには、コレクションに対してクエリを実行します。

db.temperatures.find()

バージョン 5.0 の新機能。

コマンド内の他の場所からアクセスできる変数を定義するには、 letオプションを使用します。

注意

変数を使用して結果をフィルタリングするには、$expr 演算子内の変数にアクセスする必要があります。

コレクション cakeFlavors を以下ように作成します。

db.cakeFlavors.insertMany( [
{ _id: 1, flavor: "chocolate" },
{ _id: 2, flavor: "strawberry" },
{ _id: 3, flavor: "cherry" }
] )

次のupdateOneコマンドは、 letオプションで設定された変数を使用します。

  • targetFlavor変数は cherryに設定されます。この変数は、一致フィルターを指定するために$eq式で使用されます。

  • newFlavor変数は orangeに設定されます。この変数は、一致したドキュメントの更新されたflavor値を指定するために$set演算子で使用されます。

db.cakeFlavors.updateOne(
{
$expr: { $eq: [ "$flavor", "$$targetFlavor" ] }
},
[
{
$set: { flavor: "$$newFlavor" }
}
],
{
let: { targetFlavor: "cherry", newFlavor: "orange" }
}
)

上記の更新操作を実行すると、 cakeFlavorsコレクションには次のドキュメントが含まれます。

[
{ _id: 1, flavor: 'chocolate' },
{ _id: 2, flavor: 'strawberry' },
{ _id: 3, flavor: 'orange' }
]

その他の例については、次のページを参照してください。