On this page
$addToSet
在本页面
Definition
$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" ]
}