Docs Menu
Docs Home
/
MongoDBマニュアル
/ / / /

$addToSet

項目一覧

  • 定義
  • 互換性
  • 構文
  • 動作
$addToSet

$addToSet 演算子は、配列に値が存在しない場合に値を追加します。すでに値が存在する場合、$addToSet はその配列に対して何も行いません。

次の環境でホストされる配置には $addToSet を使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

$addToSet 演算子の形式は次のとおりです。

{ $addToSet: { <field1>: <value1>, ... } }

<field> を埋め込みドキュメントまたは配列で指定するには、ドット表記を使用します。

MongoDB 5.0 以降、更新演算子では名前が文字列ベースのドキュメントフィールドを辞書順に処理します。数値名のフィールドは、数値順に処理されます。詳細については、「更新演算子の動作」を参照してください。

$addToSet は、重複する項目がセットに追加されないことを保証するだけで、既存の重複要素には影響しません。また、$addToSet は、変更されたセット内の要素の特定の順序を保証しません。

MongoDB 5.0 以降、$addToSetなどの更新演算子を空のオペランド式({ })と併用しても、mongod でエラーが発生しなくなりました。空の更新を使用すると変更は一切されず、oplog エントリも作成されません(操作は実行されません)。

アップデート対象のドキュメントには存在しないフィールドで $addToSet を使用すると、$addToSet は、指定された値を要素として、配列フィールドを作成します。

$addToSet を配列では ないフィールドで使用すると、操作は失敗します。

たとえば、pigments コレクションを作成します。

db.pigments.insertOne( { _id: 1, colors: "blue, green, red" } )

colors フィールドは配列ではありません。次の$addToSet 操作は正常に実行されません。

db.pigments.updateOne(
{ _id: 1 },
{ $addToSet: { colors: "mauve" } }
)

値が配列の場合、$addToSet はその配列全体を単一の要素として追加します。

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

db.alphabet.insertOne( { _id: 1, letters: ["a", "b"] } )

次の操作で、letters フィールドに配列 [ "c", "d" ] が追加されます。

db.alphabet.updateOne(
{ _id: 1 },
{ $addToSet: { letters: [ "c", "d" ] } }
)

配列 [ "c", "d" ] は 1 つの要素として追加されます。

{ _id: 1, letters: [ 'a', 'b', [ 'c', 'd' ] ] }

Tip

値の各要素を個別に追加するには、$each 修飾子と $addToSet を一緒に使用します。詳しくは、「$each修飾子」を参照してください。

値がドキュメントで、配列内の既存のドキュメントが追加されるドキュメントと完全に一致する場合、つまり既存のドキュメントのフィールドと値がまったく同じ、かつフィールドの順序が同じ場合、MongoDB はドキュメントが重複していると判断します。そのため、フィールドの順序は重要であり、MongoDB がドキュメント内のフィールドのサブセットのみを比較して、ドキュメントが既存の配列要素の複製であるかどうかを判断するように指定することはできません。

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

db.inventory.insertOne(
{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }
)

次の操作では、配列に "accessories" が存在しないため、要素 "accessories"tags 配列に追加されます。

db.inventory.updateOne(
{ _id: 1 },
{ $addToSet: { tags: "accessories" } }
)

次の $addToSet 操作は、"camera" がすでに tags 配列の要素であるため効果がありません。

db.inventory.updateOne(
{ _id: 1 },
{ $addToSet: { tags: "camera" } }
)

$addToSet 演算子は $each 修飾子とともに使用できます。$each修飾子を使用すると、$addToSet演算子で配列フィールドに複数の値を追加できます。

コレクション inventory には、次のドキュメントがあります。

{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }

次の操作では、$addToSet 演算子と $each 修飾子を使用して、tags 配列に複数の要素を追加します。

db.inventory.updateOne(
{ _id: 2 },
{ $addToSet: { tags: { $each: [ "camera", "electronics", "accessories" ] } } }
)

この操作では、"camera""accessories"のみが tags 配列に追加されます。"electronics" はすでに配列内に存在しました。

{
_id: 2,
item: "cable",
tags: [ "electronics", "supplies", "camera", "accessories" ]
}

Tip

以下も参照してください。

戻る

$[<identifier>]