定義
互換性
次の環境でホストされる配置には $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" ] }