Como remover o elemento do array no mongodb?


129

Aqui está a estrutura do array

contact: {
    phone: [
        {
            number: "+1786543589455",
            place: "New Jersey",
            createdAt: ""
        }
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }

    ]
}

Aqui eu sei apenas o mongo id ( _id) e o número de telefone ( +1786543589455) e preciso remover todo o elemento correspondente da matriz do documento. ou seja, o elemento indexado zero na matriz telefônica corresponde ao número de telefone e precisa remover o elemento correspondente da matriz.

contact: {
    phone: [
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }
    ]
}

Eu tentei com o seguinte método de atualização

collection.update(
    { _id: id, 'contact.phone': '+1786543589455' },
    { $unset: { 'contact.phone.$.number': '+1786543589455'} }
);

Mas ele remove number: +1786543589455do objeto da matriz interna, não o elemento indexado zero na matriz do telefone. Tentei pulltambém sem sucesso.

Como remover o elemento do array no mongodb?

Respostas:


237

Tente a seguinte consulta:

collection.update(
  { _id: id },
  { $pull: { 'contact.phone': { number: '+1786543589455' } } }
);

Ele encontrará o documento fornecido _ide removerá o telefone +1786543589455de sua contact.phonematriz.

Você pode usar $unsetpara desarmar o valor na matriz (defina-o null), mas não para removê-lo completamente.


3
Obrigado. Isso funciona bem. Eu tentei com { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }e { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }sem sucesso. Não entende o trabalho de operadores posicionais aqui?
9303 Justin

1
Existe chamada de volta com isso?
Oliver Dixon

1
@iLoveUnicorns, você pode adicionar um retorno de chamada como terceiro argumento ou usar a promessa retornada.
Leonid Beschastny

@LeonidBeschastny Eu tentei isso. No meu caso, tenho vários documentos com a mesma chave. Quero $ puxar todos esses documentos, mas a consulta atual altera apenas 1 documento e depois para. Que mudanças eu preciso?
Shubham A.

1
@ShubhamA. por padrão, .update()atualiza um único documento. Para atualizar vários documentos, use a { multi: true }opção Veja a db.collection.updatedocumentação para detalhes .
Leonid Beschastny

14

Este código abaixo removerá o elemento de objeto completo da matriz, onde o número de telefone é '+1786543589455'

db.collection.update(
  { _id: id },
  { $pull: { 'contact': { number: '+1786543589455' } } }
);

4

Em Mongoose: do documento :

Para remover um documento de uma matriz de subdocumentos, podemos passar um objeto com um _id correspondente.

contact.phone.pull({ _id: itemId }) // remove
contact.phone.pull(itemId); // this also works

Veja a resposta de Leonid Beschastny para a resposta correta.


3

Você pode simplesmente usar $ pull para remover um sub-documento. O operador $ pull remove de uma matriz existente todas as instâncias de um valor ou valores que correspondem a uma condição especificada.

Collection.update({
    _id: parentDocumentId
  }, {
    $pull: {
      subDocument: {
        _id: SubDocumentId
      }
    }
  });

Isso localizará o documento pai em relação ao ID fornecido e removerá o elemento do subDocument que corresponde aos critérios especificados.

Leia mais sobre pull aqui .


0

Se você usa a API Mongoose e procura extrair um objeto sub / filho: Leia este documento Não se esqueça de usar save () quando terminar de editar, caso contrário as alterações não serão salvas no banco de dados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.