Como removo documentos usando o Node.js Mongoose?


291
FBFriendModel.find({
    id: 333
}, function (err, docs) {
    docs.remove(); //Remove all the documents that match!
});

O exposto acima não parece funcionar. Os registros ainda estão lá.

Alguém pode consertar?

Respostas:


489

Se você não quiser repetir, tente FBFriendModel.find({ id:333 }).remove( callback );ouFBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.finddevolve uma consulta , que tem uma removefunção .

A atualização para o Mongoose v5.5.3 - remove()agora está obsoleta. Use deleteOne(), deleteMany()oufindOneAndDelete() instead.


3
Isso executa o middleware pré / pós-remoção? (alguns métodos de modelo de bypass middleware documento e eu não tenho certeza se este é um deles, os documentos não são claras)
— hunterloftis

12
Suponho que o @hunterloftis já tenha descoberto isso, mas para quem está lendo a resposta é não, isso não funcionará antes / depois do middleware em documentos individuais.
— usar o seguinte código

Parece que muitas das outras respostas mencionam, .exec()no entanto, isso não acontece. É .exec()necessário, existem efeitos colaterais em usá-lo ou não?
— DanH

Os documentos são claros (talvez tenham sido atualizados) que isso ignora o middleware - consulte a parte inferior do mongoosejs.com/docs/middleware.html -, portanto, tenha cuidado, o uso desse método pode causar problemas sérios e difíceis de rastrear.
— Jed Watson

1
Ótima resposta! Quais são os argumentos do retorno de chamada?
— precisa saber é o seguinte

299

ATUALIZAÇÃO: versão Mongoose (5.5.3)

remove () foi descontinuado e você pode usar deleteOne (), deleteMany () ou bulkWrite ().

A partir de "mongoose": ">=2.7.1"que você pode remover o documento diretamente com o .remove()método em vez de encontrar o documento e, em seguida, removê-lo o que me parece mais eficiente e fácil de manter.

Consultar exemplo:

Model.remove({ _id: req.body.id }, function(err) {
    if (!err) {
            message.type = 'notification!';
    }
    else {
            message.type = 'error';
    }
});

ATUALIZAR:

No mangusto 3.8.1, existem vários métodos que permitem remover diretamente um documento, como:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

Consulte os documentos da API mangusto para obter mais informações.


13
Conforme observado em outros comentários para outras respostas, isso ignora o middleware definido no esquema e pode ser realmente perigoso. Portanto, use-o apenas se entender o impacto que isso terá. Para mais informações, consulte mongoosejs.com/docs/middleware.html
— Jed Watson

2
Apenas para o registro, até agora eu sempre tê-los usado sem quaisquer efeitos secundários, com certeza, eu tinha para não usar qualquer middleware em meus projetos :)
— diosney

8
remove(query)potencialmente pode esvaziar toda a sua coleção se você passar acidentalmente query = {}. Por esse motivo, prefiro findOneAndRemove(query)se estiver removendo apenas um documento.
— Joeytwiddle 14/09/16

1
Observe também que isso não está retornando uma consulta, portanto, nem uma promessa. Você não pode fazerModel.remove({ _id: 'whatever' }).exec().then(...)
— David

48

docsé uma variedade de documentos. então não tem um mongooseModel.remove()método.

Você pode iterar e remover cada documento da matriz separadamente.

Ou - já que parece que você está encontrando os documentos por um (provavelmente) ID único - use em findOnevez de find.


5
Visto que esta resposta assume uma versão bastante antiga do mangusto, eu realmente não me oponho a alguém que mude a resposta aceita.
— Mtkopone 12/05

Essa é realmente uma das melhores maneiras de fazer isso, porque invoca corretamente o middleware definido no esquema - consulte mongoosejs.com/docs/middleware.html . Você só deve usar os outros métodos se NÃO estiver usando middleware em seu aplicativo e, em seguida, com cuidado.
— Jed Watson

41

Isso para mim é o melhor da versão 3.8.1:

MyModel.findOneAndRemove({field: 'newValue'}, function(err){...});

E isso requer apenas uma chamada de banco de dados. Use isso, pois você não realiza nenhumaremove ação pior para a pesquisa e remoção.


1
Contanto que você não precise executar pre 'remove'ações, ele funciona bem.
— precisa

32

Simplesmente faça

FBFriendModel.remove().exec();

1
Simples e eficaz.
— Rich Apodaca

1
Isso retorna uma promessa? Em caso afirmativo, qual objeto é definido quando a promessa é resolvida?
— 22816 Kenny Worden

@KennyWorden uma abordagem eficaz para encontrar a resposta -> mongoosejs.com/docs/api.html , procure o que deseja, mas acrescente '#' à pesquisa na página com seu navegador, como em '#save' e você vou ver que retorna uma promessa.
— Jason Sebring

3
Esta é uma espécie de resposta perigoso sem colocar a condição da op especificado na remoção ...
— blak3r

29

mongoose.model.find()retorna um objeto de consulta que também tem uma remove()função.

Você também pode usar mongoose.model.findOne()se quiser remover apenas um documento exclusivo.

Caso contrário, você pode seguir a abordagem tradicional, bem como onde primeiro recuperou o documento e depois remove.

yourModelObj.findById(id, function (err, doc) {
    if (err) {
        // handle error
    }

    doc.remove(callback); //Removes the document
})

A seguir, são apresentadas as formas do modelobjeto que você pode executar para remover os documentos:

yourModelObj.findOneAndRemove(conditions, options, callback)

yourModelObj.findByIdAndRemove(id, options, callback)

yourModelObj.remove(conditions, callback);

var query = Comment.remove({ _id: id });
query.exec();

22

remove()foi descontinuado. Use deleteOne(), deleteMany()ou bulkWrite().

O código que eu uso

TeleBot.deleteMany({chatID: chatID}, function (err, _) {
                if (err) {
                    return console.log(err);
                }
            });

1
Esta resposta honestamente precisa de mais votos. É injustamente colocado no fundo do barril (porque não está recebendo meia década de votos antigos), mas é a única resposta que resolve o problema de:(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
— Steven Ventimiglia

18

Para generalizar você pode usar:

SomeModel.find( $where, function(err,docs){
  if (err) return console.log(err);
  if (!docs || !Array.isArray(docs) || docs.length === 0) 
    return console.log('no docs found');
  docs.forEach( function (doc) {
    doc.remove();
  });
});

Outra maneira de conseguir isso é:

SomeModel.collection.remove( function (err) {
  if (err) throw err;
  // collection is now empty but not deleted
});

18

Cuidado com o findOne e remova-o!

  User.findOne({name: 'Alice'}).remove().exec();

O código acima remove TODOS os usuários nomeados 'Alice', em vez do primeiro .

A propósito, prefiro remover documentos como este:

  User.remove({...}).exec();

Ou forneça um retorno de chamada e omita o exec ()

  User.remove({...}, callback);


12

Se você estiver procurando apenas um objeto a ser removido, poderá usar

Person.findOne({_id: req.params.id}, function (error, person){
        console.log("This object will get deleted " + person);
        person.remove();

    });

Neste exemplo, o Mongoose será excluído com base na correspondência req.params.id.


Bem-vindo ao Stackoverflow. Sua resposta é uma duplicata de várias respostas neste tópico. Além disso, você deve sempre verificar se há erros nos retornos de chamada.
— VtoCorleone

9

.remove()funciona como .find():

MyModel.remove({search: criteria}, function() {
    // removed.
});

9

Prefiro a notação de promessa, onde você precisa, por exemplo

Model.findOneAndRemove({_id:id})
    .then( doc => .... )

7

Para remover documento, prefiro usar Model.remove(conditions, [callback])

Consulte a documentação da API para remover: -

http://mongoosejs.com/docs/api.html#model_Model.remove

Nesse caso, o código será: -

FBFriendModel.remove({ id : 333 }, function(err, callback){
console.log(‘Do Stuff’);
})

Se você deseja remover documentos sem aguardar uma resposta do MongoDB, não transmita um retorno de chamada, será necessário chamar exec na Consulta retornada

var removeQuery = FBFriendModel.remove({id : 333 });
removeQuery.exec();

6

Você pode simplesmente usar a consulta diretamente na função remover, portanto:

FBFriendModel.remove({ id: 333}, function(err){});

6

Você sempre pode usar a função interna do Mongoose:

var id = req.params.friendId; //here you pass the id
    FBFriendModel
   .findByIdAndRemove(id)
   .exec()
   .then(function(doc) {
       return doc;
    }).catch(function(error) {
       throw error;
    });

5

Atualização: .remove()está obsoleta, mas isso ainda funciona para versões mais antigas

YourSchema.remove({
    foo: req.params.foo
}, function(err, _) {
    if (err) return res.send(err)
    res.json({
        message: `deleted ${ req.params.foo }`
    })
});

Model.remove está obsoleto
— Maxwell sc

2

usando o método remove () que você pode remover.

getLogout(data){
        return this.sessionModel
        .remove({session_id: data.sid})
        .exec()
        .then(data =>{
            return "signup successfully"
        })
    }

Model.remove está obsoleto
— Maxwell sc

1
Maxwell sc, faça uma solicitação de edição e corrija. Sei que você é novo no SO, mas é muito mais útil corrigi-lo do que comentar que é depreciado. Talvez você poderia sugerir uma edição da próxima vez, ou fazer uma edição si mesmo, e tomar um pouco de propriedade da situação ...
— Joshua Michael Wagoner

1

Isso funcionou para mim, apenas tente o seguinte:

const id = req.params.id;
      YourSchema
      .remove({_id: id})
      .exec()
      .then(result => {
        res.status(200).json({
          message: 'deleted',
          request: {
            type: 'POST',
            url: 'http://localhost:3000/yourroutes/'
          }
        })
      })
      .catch(err => {
        res.status(500).json({
          error: err
        })
      });

Model.removeestá obsoleto
— Maxwell sc

1

De acordo com a resposta de Samyak Jain, eu uso o Async Await

let isDelete = await MODEL_NAME.deleteMany({_id:'YOUR_ID', name:'YOUR_NAME'});

0

Eu realmente gosto desse padrão em aplicativos Express / Mongoose assíncronos / aguardados:

app.delete('/:idToDelete', asyncHandler(async (req, res) => {
  const deletedItem = await YourModel
    .findByIdAndDelete(req.params.idToDelete) // This method is the nice method for deleting
    .catch(err => res.status(400).send(err.message))

  res.status(200).send(deletedItem)
}))

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.