Update Arrays in a Document — Go
Docs Menu

Docs HomeGo

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

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 than 10.

  • 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 than 18.

  • 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 ドキュメントを参照してください。

フィードバックを送る