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?

Justin John
fonte

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.

Leonid Beschastny
fonte
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' } } }
);
chirag jain
fonte
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.

Md Alamin
fonte
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 .

Syeda Aimen Batool
fonte
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.

NonameLover
fonte