ドキュメント内の配列の更新
Overview
In this guide, you can learn how to update array elements in a document.
配列内の要素を更新するには、次のアクションを実行します。
更新を指定する更新ドキュメントを入力します。
どの配列要素をアップデートするかを指定します。
これらの指定で更新操作を使用して更新を実行します。
サンプル データ
このガイドの例を実行するには、次のスニペットを使用してサンプルデータを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
値が切り捨てられます。この値はドライバーが個別に生成するためです。
配列要素の指定
To specify which array elements to update, use a positional operator. Positional operators can specify the first, multiple, or all array elements to update.
位置演算子を使用して配列要素を指定するには、ドット表記を使用します。 ドット表記は、埋め込みドキュメントの配列要素とフィールドを操作するためのプロパティ アクセス構文です。
最初の配列要素
クエリフィルターに一致する最初の配列要素を更新するには、位置指定の$
演算子を使用します。 配列フィールドでは、クエリフィルターは である必要があります。
例
この例では、次のアクションを実行します。
Matches array elements in
qty
where the value is greater than10
.Decrements the first array value matched by
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)
注意
The query filter matches the values 15
and 12
. Since 15
is the first element matched, it is updated. If you want to update
both matched values, see Multiple Array Elements.
複数の配列要素
クエリフィルターに一致する複数の配列要素を更新するには、フィルタリングされた位置指定$[<identifier>]
演算子を使用します。 アップデート操作に配列フィルターを含めて、アップデートする配列要素を指定する必要があります。
<identifier>
は、配列フィルター内で使用する名前です。 この値は小文字で始まり、含めることができるのは英数字のみです。
例
この例では、次のアクションを実行します。
Creates an array filter with an identifier called
smaller
to match elements less than18
.SetArrayFilters()
メソッドを使用して配列フィルターを適用します。Increments every matched element by
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)
すべての配列要素
すべての配列要素を更新するには、すべての位置指定$[]
演算子を使用します。
注意
配列フィールドにクエリフィルターを指定すると、位置指定の$[]
演算子はクエリフィルターを無視し、すべての配列要素を更新します。
例
This example multiplies every array element in qty
by 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 ドキュメントを参照してください。