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 } ]
}
]
}