$pull
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>
,请使用点表示法。
Behavior行为
Starting in MongoDB 5.0, update operators process document fields with string-based names in lexicographic order. 从MongoDB 5.0开始,update运算符按照字典顺序处理具有基于字符串的名称的文档字段。Fields with numeric names are processed in numeric order. 具有数字名称的字段按数字顺序处理。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 All Items That Match a Specified 有关示例,请参阅使用$pull
Condition With bulkWrite()
for an example.bulkWrite()
移除与指定$pull
条件匹配的所有项。
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条目(这意味着该操作是无操作)。
Examples实例
Remove All Items That Equal a Specified Value删除所有等于指定值的项
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 thefruits
arrayfruits
数组中的"apples"
和"oranges"
"carrots"
from thevegetables
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' ]
}
Remove All Items That Match a Specified $pull
Condition删除所有符合指定$pull
条件的项目
$pull
ConditionCreate 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 ] }
Remove All Items That Match a Specified $pull
Condition With bulkWrite()
使用bulkWrite()
删除与指定$pull
条件匹配的所有项
$pull
Condition With bulkWrite()
The following 以下db.collection.bulkWrite()
operation:db.collection.bulkWrite()
操作:
Creates the创建profilesBulkWrite
collection.profilesBulkWrite
集合。Removes all items from the从votes
array that are greater than or equal to ($gte
)6
.votes
数组中删除所有大于或等于($gte
)6
的项目。Removes all items from the从votes
array that are less than or equal to ($lte
)3
.votes
数组中删除所有小于或等于($lte
)3
的项目。
try {
db.profilesBulkWrite.bulkWrite( [
{
insertOne: {
"document": { _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] }
}
},
{
updateOne: {
"filter": { _id: 1 },
"update": { $pull: { votes: { $gte: 6 } } }
}
},
{
updateOne: {
"filter": {_id: 1},
"update": { $pull: { votes: { $lte: 3 } } }
}
}
] );
} catch (e) {
print(e);
}
bulkWrite()
The db.collection.bulkWrite()
method executes multiple write operations listed in an array. db.collection.bulkWrite()
方法执行数组中列出的多个写入操作。In this example, the 在本例中,db.collection.bulkWrite()
performs multiple operations on the profiles
collection.db.collection.bulkWrite()
对profiles
集合执行多个操作。
After the 在执行db.collection.bulkWrite()
operation, you can confirm the document only has values less than 6 and greater than 3 using the following operation:db.collection.bulkWrite()
操作后,可以使用以下操作确认文档的值仅小于6
且大于3
:
db.profilesBulkWrite.find()
The operation returns the following:该操作返回以下内容:
[ { _id: 1, votes: [ 5 ] } ]
Remove Items from an Array of Documents从文档数组中删除项目
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.然后重新创建它以运行此示例。
Remove Documents from Nested Arrays从嵌套数组中删除文档
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
数组的元素与突出显示的行中的选择条件匹配时,从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 } ]
}
]
}