Docs Menu

Docs HomeGo

ドキュメント内の配列の更新

項目一覧

  • Overview
  • サンプル データ
  • 配列要素の指定
  • 最初の配列要素
  • 複数の配列要素
  • すべての配列要素
  • 詳細情報
  • API ドキュメント

このガイドでは、ドキュメント内の配列要素をアップデートする方法を学習できます。

配列内の要素を更新するには、次のアクションを実行します。

  • 更新を指定する更新ドキュメントを入力します。

  • どの配列要素をアップデートするかを指定します。

  • これらの指定で更新操作を使用して更新を実行します。

このガイドの例を実行するには、次のスニペットを使用してサンプルデータを quantity.teaコレクションにロードします。

coll := client.Database("tea").Collection("quantity")
docs := []interface{}{
bson.D{{"type", "Masala"}, {"qty", bson.A{15, 12, 18}}},
}
result, err := coll.InsertMany(context.TODO(), docs)
if err != nil {
panic(err)
}
fmt.Printf("%d documents inserted with IDs:\n", len(result.InsertedIDs))

Tip

存在しないデータベースとコレクション

書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。

次の例では、 FindOneAndUpdate()メソッドを使用してドキュメントを取得してアップデートし、アップデート後にドキュメントの状態を返します。 配列フィールドを使用して複数のドキュメントを更新する場合は、 UpdateMany()メソッドを使用します。

注意

各例ではObjectID値が切り捨てられます。この値はドライバーが個別に生成するためです。

アップデートする配列要素を指定するには、位置演算子を使用します。 位置演算子では、アップデートする最初の複数の、またはすべての配列要素を指定でき

位置演算子を使用して配列要素を指定するには、ドット表記を使用します。 ドット表記は、埋め込みドキュメントの配列要素とフィールドを操作するためのプロパティ アクセス構文です。

クエリフィルターに一致する最初の配列要素を更新するには、位置指定の$演算子を使用します。 配列フィールドでは、クエリフィルターは である必要があります。

この例では、次のアクションを実行します。

  • 値が10より大きいqty内の配列要素と一致します。

  • 一致する最初の配列値を5によって減算します。

filter := bson.D{{"qty", bson.D{{"$gt", 10}}}}
update := bson.D{{"$inc", bson.D{{"qty.$", -5}}}}
opts := options.FindOneAndUpdate().SetReturnDocument(options.After)
var updatedDoc bson.D
err := coll.FindOneAndUpdate(context.TODO(), filter, update, opts).Decode(&updatedDoc)
if err != nil {
panic(err)
}
fmt.Println(updatedDoc)

注意

クエリフィルターは、値1512の値と一致します。 15は最初に一致した要素であるため、更新されます。 一致する値の両方をアップデートする場合は、「複数の配列要素 」を参照してください。

クエリフィルターに一致する複数の配列要素を更新するには、フィルタリングされた位置指定$[<identifier>]演算子を使用します。 アップデート操作に配列フィルターを含めて、アップデートする配列要素を指定する必要があります。

<identifier>は、配列フィルター内で使用する名前です。 この値は小文字で始まり、含めることができるのは英数字のみです。

この例では、次のアクションを実行します。

  • 18未満の要素をマッチングするために、 smallerという識別子を持つ配列フィルターを作成します。

  • SetArrayFilters()メソッドを使用して配列フィルターを適用します。

  • 一致したすべての要素を7ずつ増加させます。

identifier := []interface{}{bson.D{{"smaller", bson.D{{"$lt", 18}}}}}
update := bson.D{{"$inc", bson.D{{"qty.$[smaller]", 7}}}}
opts := options.FindOneAndUpdate().SetArrayFilters(options.ArrayFilters{Filters: identifier}).SetReturnDocument(options.After)
var updatedDoc bson.D
err := coll.FindOneAndUpdate(context.TODO(), bson.D{}, update, opts).Decode(&updatedDoc)
if err != nil {
panic(err)
}
fmt.Println(updatedDoc)

すべての配列要素を更新するには、すべての位置指定$[]演算子を使用します。

注意

配列フィールドにクエリフィルターを指定すると、位置指定の$[]演算子はクエリフィルターを無視し、すべての配列要素を更新します。

この例では、 内のすべての配列要素にqty 2を乗算します。

update := bson.D{{"$mul", bson.D{{"qty.$[]", 2}}}}
opts := options.FindOneAndUpdate().SetReturnDocument(options.After)
var updatedDoc bson.D
err := coll.FindOneAndUpdate(context.TODO(), bson.D{}, update, opts).Decode(&updatedDoc)
if err != nil {
panic(err)
}
fmt.Println(updatedDoc)

このガイドで説明した操作の詳細については、次のガイドを参照してください。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。

←  ドキュメントの変更1 回の操作で挿入またはアップデート →
フィードバックを送る
© 2022 MongoDB, Inc.

会社概要

© 2022 MongoDB, Inc.