Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / / /

$pull

Nesta página

  • Compatibilidade
  • Sintaxe
  • Comportamento
  • Exemplos
$pull

O operador $pull remove de uma array existente todas as instâncias de um valor ou valores que correspondem a uma condição especificada.

Você pode utilizar o $pull para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem

  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

O operador $pull tem o seguinte formato:

{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }

Para especificar um <field> em um documento incorporado ou em uma array, use a notação de ponto.

A partir do MongoDB 5.0, os operadores de atualização processam campos de documento com nomes baseados em cadeia de caracteres em ordem lexicográfica. Os campos com nomes numéricos são processados em ordem numérica. Consulte Atualizar Comportamento de Operadores para detalhes.

Se você especificar um <condition> e os elementos de array forem documentos incorporados, o operador $pull aplicará o <condition> como se cada elemento de array fosse um documento em uma coleção. Consulte Remover todos os itens que correspondem a uma condição $pull especificada com bulkWrite() para obter um exemplo.

Se o <value> especificado a ser removido for uma array, $pull removerá somente os elementos da array que correspondam exatamente ao <value> especificado, incluindo a ordem.

Se o <value> especificado a ser removido for um documento, $pull removerá apenas os elementos da array que têm exatamente os mesmos campos e valores. A ordem dos campos pode ser diferente.

A partir do MongoDB 5.0, mongod não gera mais um erro ao usar um operador de atualização como $pull com uma expressão de operando vazia ( { } ). Uma atualização vazia não resulta em alteração e nenhuma entrada no oplog é criada (o que significa que é sem operação).

Crie a coleção 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" ]
}
] )

A seguinte operação remove

  • "apples" e "oranges" a partir da array fruits

  • "carrots" da array vegetables

db.stores.updateMany(
{ },
{ $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } }
)

Confirme o resultado com db.collection.find():

{
_id: 1,
fruits: [ 'pears', 'grapes', 'bananas' ],
vegetables: [ 'celery', 'squash' ]
},
{
_id: 2,
fruits: [ 'plums', 'kiwis', 'bananas' ],
vegetables: [ 'broccoli', 'zucchini', 'onions' ]
}

Crie a coleção profiles:

db.profiles.insertOne( { _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] } )

A operação a seguir removerá todos os itens da array votes que são maiores ou iguais a ( $gte ) 6:

db.profiles.updateOne( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )

Após a operação de atualização, o documento só apresenta valores inferiores a 6:

{ _id: 1, votes: [ 3, 5 ] }

A seguinte operação do db.collection.bulkWrite():

  • Cria a coleção profilesBulkWrite.

  • Remove todos os itens da array votes que são maiores ou iguais a ( $gte ) 6.

  • Remove todos os itens da array votes que são menores ou iguais a ( $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);
}

Observação

bulkWrite()

O método db.collection.bulkWrite() executa múltiplas operações de gravação listadas em uma array. Neste exemplo, o db.collection.bulkWrite() executa diversas operações na coleção profiles .

Após a operação db.collection.bulkWrite(), você pode confirmar que o documento só tem valores menores que 6 e maiores que 3 usando a seguinte operação:

db.profilesBulkWrite.find()

A operação retorna o seguinte:

[ { _id: 1, votes: [ 5 ] } ]

Crie a coleção 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 }
]
}
] )

A operação a seguir remove todos os elementos da array results que contém um campo score igual a 8 e um campo item igual a "B":

db.survey.updateMany(
{ },
{ $pull: { results: { score: 8 , item: "B" } } }
)

A expressão $pull aplica a condição para cada elemento da array results como se fosse um documento de nível superior.

Após a operação, a array results não contém documentos que contenham um campo score igual a 8 e um campo item igual a "B".

{ _id: 1, results: [ { item: 'A', score: 5 } ] },
{
_id: 2,
results: [ { item: 'C', score: 8 }, { item: 'B', score: 4 } ]
}

O operador $pull trata cada elemento como um objeto de nível superior. A consulta é aplicada a cada elemento. A expressão não precisa usar $elemMatch para especificar condições de correspondência.

Pelo contrário, a operação a seguir não $pull (extrai) nenhum elemento da coleção original:

db.survey.updateMany(
{ },
{ $pull: { results: { $elemMatch: { score: 8 , item: "B" } } } }
)

Observação

Solte a coleção survey com:

Em seguida, recrie-o para executar este exemplo.

Crie uma nova coleção do survey com documentos incorporados em arrays aninhados.

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

Em seguida, você pode especificar várias condições nos elementos da array answers com $elemMatch:

db.survey.updateMany(
{ },
{
$pull:
{
results:
{
answers: { $elemMatch: { q: 2, a: { $gte: 8 } } }
}
}
}
)

A operação atualizou a array results em cada documento que correspondeu. db.collection.updateMany() documentos removidos do results quando um elemento da array answers incorporada correspondia às condições de seleção na linha realçada.

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

Dica

Veja também:

Voltar

$pop