$pull
$pull
- The
$pull
operator removes from an existing array allinstances of a value or values that match a specified condition.
The $pull
operator has the form:
- { $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
To specify a <field>
in an embedded document or in an array, usedot notation.
Behavior
If you specify a <condition>
and the array elements are embeddeddocuments, $pull
operator applies the <condition>
as if eacharray element were a document in a collection. SeeRemove 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.
If the specified <value>
to remove is a document, $pull
removes only the elements in the array that have the exact same fieldsand values. The ordering of the fields can differ.
Examples
Remove All Items That Equal a Specified Value
Given the following document in the stores
collection:
- {
- _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 updates all documents in the collection toremove "apples"
and "oranges"
from the array fruits
andremove "carrots"
from the array vegetables
:
- db.stores.update(
- { },
- { $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } },
- { multi: true }
- )
After the operation, the fruits
array no longer contains any"apples"
or "oranges"
values, and the vegetables
array nolonger contains any "carrots"
values:
- {
- "_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
Given the following document in the profiles
collection:
- { _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] }
The following operation will remove all items from the votes
arraythat are greater than or equal to ($gte
) 6
:
- db.profiles.update( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )
After the update operation, the document only has values less than 6:
- { _id: 1, votes: [ 3, 5 ] }
Remove Items from an Array of Documents
A survey
collection contains the following documents:
- {
- _id: 1,
- results: [
- { item: "A", score: 5 },
- { item: "B", score: 8, comment: "Strongly agree" }
- ]
- }
- {
- _id: 2,
- results: [
- { item: "C", score: 8, comment: "Strongly agree" },
- { item: "B", score: 4 }
- ]
- }
The following operation will remove from the results
array allelements that contain both a score
field equal to 8
and anitem
field equal to "B"
:
- db.survey.update(
- { },
- { $pull: { results: { score: 8 , item: "B" } } },
- { multi: true }
- )
The $pull
expression applies the condition to each element ofthe results
array as though it were a top-level document.
After the operation, the results
array contains no documents thatcontain both a score
field equal to 8
and an item
fieldequal to "B"
.
- {
- "_id" : 1,
- "results" : [ { "item" : "A", "score" : 5 } ]
- }
- {
- "_id" : 2,
- "results" : [
- { "item" : "C", "score" : 8, "comment" : "Strongly agree" },
- { "item" : "B", "score" : 4 }
- ]
- }
Because $pull
operator applies its query to each element asthough it were a top-level object, the expression did not require theuse of $elemMatch
to specify the condition of a score
field equal to 8
and item
field equal to "B"
. In fact, thefollowing operation will not pull any element from the originalcollection.
- db.survey.update(
- { },
- { $pull: { results: { $elemMatch: { score: 8 , item: "B" } } } },
- { multi: true }
- )
However, if the survey
collection contained the followingdocuments, where the results
array contains embedded documents thatalso contain arrays:
- {
- _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 theanswers
array with $elemMatch
:
- db.survey.update(
- { },
- { $pull: { results: { answers: { $elemMatch: { q: 2, a: { $gte: 8 } } } } } },
- { multi: true }
- )
The operation removed from the results
array those embeddeddocuments with an answers
field that contained at least one elementwith q
equal to 2
and a
greater than or equal to 8
:
- {
- "_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 } ] }
- ]
- }
See also