$addToSet

在本页面

Definition

  • $addToSet
    • 除非该值已存在,否则$addToSet运算符将一个值添加到数组,在这种情况下$addToSet对该数组不执行任何操作。

$addToSet运算符的格式为:

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

要在嵌入式文档或数组中指定<field>,请使用dot notation

Behavior

$addToSet仅确保没有重复添加到集合中,并且不影响现有的重复元素。 $addToSet不保证修改后的集合中的元素具有特定的 Sequences。

Missing Field

如果您对文档中不存在的字段使用$addToSet进行更新,则$addToSet将创建具有指定值作为其元素的数组字段。

字段不是数组

如果在不是数组的字段上使用$addToSet,则该操作将失败。例如,考虑集合foo中包含非数组字段colors的文档。

{ _id: 1, colors: "blue,green,red" }

对非数组字段colors的以下$addToSet操作失败:

db.foo.update(
   { _id: 1 },
   { $addToSet: { colors: [ "c", "d" ] } }
)

要添加的值是一个数组

如果值是一个数组,则$addToSet将整个数组附加为单个元素。

考虑集合test中包含数组字段letters的文档:

{ _id: 1, letters: ["a", "b"] }

以下操作将数组[ "c", "d" ]附加到letters字段:

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

letters数组现在包含[ "c", "d" ]数组作为元素:

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

Tip

要分别单独添加值**的每个元素,请使用$each修饰符和$addToSet。有关详细信息,请参见$each Modifier

要添加的值是文档

如果值为文档,则如果数组中的现有文档与要添加的文档完全匹配,则 MongoDB 会确定该文档为重复文档;也就是说,现有文档具有完全相同的字段和值,并且字段的 Sequences 相同。因此,字段 Sequences 很重要,您不能指定 MongoDB 仅比较文档中字段的一部分来确定文档是否与现有数组元素重复。

Examples

考虑包含以下文档的集合inventory

{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }

添加到数组

以下操作将元素"accessories"添加到tags数组,因为"accessories"在数组中不存在:

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

价值已存在

以下$addToSet操作无效,因为"camera"已经是tags数组的元素:

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

$each Modifier

您可以将$addToSet运算符与$each修饰符一起使用。 $each修饰符允许$addToSet运算符将多个值添加到数组字段。

集合inventory包含以下文档:

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

然后,以下操作将$addToSet运算符与$each修饰符结合使用,以将多个元素添加到tags数组中:

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

该操作仅将"camera""accessories"添加到tags数组中,因为"electronics"已存在于该数组中:

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