$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' ] ] }
付加する値がドキュメント
値がドキュメントで、配列内の既存のドキュメントが追加されるドキュメントと完全に一致する場合、つまり既存のドキュメントのフィールドと値がまったく同じ、かつフィールドの順序が同じ場合、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" } } )
$each
Modifier
$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" ] }