ドキュメント内の配列の更新
Overview
このガイドでは、ドキュメント内の配列要素をアップデートする方法を学習できます。
配列内の要素を更新するには、次のアクションを実行します。
更新を指定する更新ドキュメントを入力します。
どの配列要素をアップデートするかを指定します。
これらの指定で更新操作を使用して更新を実行します。
サンプル データ
このガイドの例を実行するには、次のスニペットを使用してサンプルデータを 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)
注意
クエリフィルターは、値15
と12
の値と一致します。 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 ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。