On this page本页内容
$pull
The $pull
operator removes from an existing array all instances of a value or values that match a specified condition.$pull
运算符从现有数组中删除与指定条件匹配的一个或多个值的所有实例。
The $pull
operator has the form:$pull
运算符的形式如下:
{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
To specify a 要在嵌入文档或数组中指定<field>
in an embedded document or in an array, use dot notation.<field>
,请使用点表示法。
Starting in MongoDB 5.0, update operators process document fields with string-based names in lexicographic order. Fields with numeric names are processed in numeric order. 从MongoDB 5.0开始,更新运算符以词典顺序处理具有基于字符串的名称的文档字段。具有数字名称的字段按数字顺序处理。See Update Operators Behavior for details.有关详细信息,请参阅更新运算符行为。
If you specify a 如果指定<condition>
and the array elements are embedded documents, $pull
operator applies the <condition>
as if each array element were a document in a collection. <condition>
并且数组元素是嵌入文档,$pull
运算符应用<condition>
就像每个数组元素是集合中的文档一样。See Remove Items from an Array of Documents for an example.有关示例,请参阅从文档数组中删除项。
If the specified 如果要删除的指定<value>
to remove is an array, $pull
removes only the elements in the array that match the specified <value>
exactly, including order.<value>
是数组,$pull
仅删除数组中与指定<value>
完全匹配的元素,包括顺序。
If the specified 如果要删除的指定<value>
to remove is a document, $pull
removes only the elements in the array that have the exact same fields and values. <value>
是文档,$pull
仅删除数组中具有完全相同字段和值的元素。The ordering of the fields can differ.字段的顺序可能会有所不同。
Starting in MongoDB 5.0, 从MongoDB 5.0开始,当使用带有空操作数表达式(mongod
no longer raises an error when you use an update operator like $pull
with an empty operand expression ( { }
). { }
)的更新运算符(如$pull
)时,mongod
不再引发错误。An empty update results in no changes and no oplog entry is created (meaning that the operation is a no-op).空更新不会导致任何更改,也不会创建oplog条目(这意味着该操作是无操作)。
Create the 创建stores
collection:stores
集合:
db.stores.insertMany( [ { _id: 1, fruits: [ "apples", "pears", "oranges", "grapes", "bananas" ], vegetables: [ "carrots", "celery", "squash", "carrots" ] }, { _id: 2, fruits: [ "plums", "kiwis", "oranges", "bananas", "apples" ], vegetables: [ "broccoli", "zucchini", "carrots", "onions" ] } ] )
The following operation removes以下操作将删除
"apples"
and "oranges"
from the fruits
arrayfruits
数组中的"apples"
和"oranges"
"carrots"
from the vegetables
arrayvegetables
数组中的"carrots"
db.stores.updateMany( { }, { $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } } )
Confirm the result with 使用db.collection.find()
:db.collection.find()
确认结果:
{ _id: 1, fruits: [ 'pears', 'grapes', 'bananas' ], vegetables: [ 'celery', 'squash' ] }, { _id: 2, fruits: [ 'plums', 'kiwis', 'bananas' ], vegetables: [ 'broccoli', 'zucchini', 'onions' ] }
$pull
Condition$pull
条件匹配的所有项Create the 创建profiles
collection:profiles
集合:
db.profiles.insertOne( { _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] } )
The following operation will remove all items from the 以下操作将从votes
array that are greater than or equal to ( $gte
) 6
:votes
数组中删除大于或等于($gte
)6
的所有项目:
db.profiles.updateOne( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )
After the update operation, the document only has values less than 6:在更新操作之后,文档只有小于6的值:
{ _id: 1, votes: [ 3, 5 ] }
Create the 创建survey
collection:survey
集合:
db.survey.insertMany([ { _id: 1, results: [ { item: "A", score: 5 }, { item: "B", score: 8 } ] }, { _id: 2, results: [ { item: "C", score: 8 }, { item: "B", score: 4 } ] } ] )
The following operation removes all elements from the 以下操作将从results
array that contain both a score
field equal to 8
and an item
field equal to "B"
:results
数组中删除包含等于8
的score
字段和等于"B"
的item
字段的所有元素:
db.survey.updateMany( { }, { $pull: { results: { score: 8 , item: "B" } } } )
The $pull
expression applies the condition to each element of the results
array as though it were a top-level document.$pull
表达式将条件应用于results
数组的每个元素,就像它是顶级文档一样。
After the operation, the 操作后,results
array contains no documents that contain both a score
field equal to 8
and an item
field equal to "B"
.results
数组不包含同时包含等于8
的score
字段和等于"B"
的item
字段的文档。
{ _id: 1, results: [ { item: 'A', score: 5 } ] }, { _id: 2, results: [ { item: 'C', score: 8 }, { item: 'B', score: 4 } ] }
The $pull
operator treats each element as a top-level object. $pull
运算符将每个元素视为顶级对象。The query is applied to each element. 查询将应用于每个元素。The expression does not need to use 表达式不需要使用$elemMatch
to specify match conditions.$elemMatch
来指定匹配条件。
On the contrary, the following operation does not 相反,以下操作不会从原始集合中$pull
any elements from the original collection:$pull
任何元素:
db.survey.updateMany( { }, { $pull: { results: { $elemMatch: { score: 8 , item: "B" } } } } )
Drop the 使用以下内容删除survey
collection with:survey
集合:
Then recreate it to run this example.然后重新创建它以运行此示例。
Create a new 使用嵌入嵌套数组中的文档创建新的survey
collection with documents that are embedded in nested arrays.survey
集合。
db.survey.drop() db.survey.insertMany( [ { _id: 1, results: [ { item: "A", score: 5, answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ] }, { item: "B", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 9 } ] } ] }, { _id: 2, results: [ { item: "C", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ] }, { item: "B", score: 4, answers: [ { q: 1, a: 0 }, { q: 2, a: 8 } ] } ] } ] )
Then you can specify multiple conditions on the elements of the 然后,您可以使用answers
array with $elemMatch
:$elemMatch
在answers
数组的元素上指定多个条件:
db.survey.updateMany( { }, { $pull: { results: { answers: { $elemMatch: { q: 2, a: { $gte: 8 } } } } } } )
The operation updated the 该操作更新了匹配的每个文档中的results
array in each document it matched. results
数组。当嵌入db.collection.updateMany()
removed documents from results
when an element of the embedded answers
array matched the selection conditions in the highlighted line.answers
数组的元素与突出显示行中的选择条件匹配时,db.collection.updateMany()
从results
中删除文档。
{ _id: 1, results: [ { item: 'A', score: 5, answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ] } ] }, { _id: 2, results: [ { item: 'C', score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ] } ] }