定義
注意
曖昧さ回避
このページでは、更新演算子として使用する場合の$addToSet について説明します。
次の他のコンテキストでは $addToSet を使用することもできます。
$addToSet (accumulator)は、入力ドキュメントの変数に基づいて単一の集計値を返します。$addToSet (window function)$setWindowFieldsは、特定のウィンドウ内のドキュメントから一意の値の配列を返すために ステージで使用されます。
互換性
次の環境でホストされる配置には $addToSet を使用できます。
- MongoDB Atlas はクラウドでのMongoDB配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$addToSet演算子の形式は次のとおりです。
{ $addToSet: { <field1>: <value1>, ... } }
<field> を埋め込みドキュメントまたは配列で指定するには、ドット表記を使用します。
動作
MongoDB 5.0 以降、更新演算子では名前が文字列ベースのドキュメントフィールドを辞書順に処理します。数値名のフィールドは、数値順に処理されます。詳細については、「更新演算子の動作」を参照してください。
$addToSetは重複する項目がセットに 追加$addToSet されないことを保証するだけで、既存の重複要素には影響しません。 は、変更されたセット内の要素の特定の順序を保証しません。
MongoDB5.0 以降、mongod $addToSetなどの更新演算子を空のオペランド式()と併用しても、{ } でエラーが発生しなくなりました。空の更新を使用すると変更は一切されず、 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 には、次のドキュメントがあります。
db.inventory.insertOne ( { _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" ] }