Come rimuovo i documenti usando Node.js Mongoose?


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

Quanto sopra non sembra funzionare. I registri sono ancora lì.

Qualcuno può risolvere?

Risposte:


489

Se non hai voglia di iterare, prova FBFriendModel.find({ id:333 }).remove( callback );oFBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.findrestituisce una query , che ha una removefunzione .

L'aggiornamento per Mongoose v5.5.3 remove()è ora obsoleto. Usa deleteOne(), deleteMany()ofindOneAndDelete() instead.


3
Questo esegue middleware pre / post-rimozione? (alcuni metodi modello ignorano il middleware dei documenti e non sono sicuro che si tratti di uno di questi, i documenti non sono chiari)
hunterloftis

12
Suppongo che @hunterloftis lo abbia già capito, ma per chiunque legga la risposta è no, questo non eseguirà il middleware pre / post su singoli documenti.
numeri 1311407,

Sembra che molte delle altre risposte menzionino, .exec()ma ciò non lo è affatto. È .exec()necessario, ci sono effetti collaterali per usarlo o no?
DanH,

I documenti sono chiari (forse sono stati aggiornati) che questo ignora il middleware - vedi la parte inferiore di mongoosejs.com/docs/middleware.html - quindi fai attenzione, l'uso di questo metodo può causare problemi gravi e difficili da rintracciare.
Jed Watson,

1
Bella risposta! quali sono gli argomenti del callback?
k88074,

299

AGGIORNAMENTO: versione Mongoose (5.5.3)

remove () è deprecato e puoi usare deleteOne (), deleteMany () o bulkWrite () invece.

A partire da "mongoose": ">=2.7.1"te puoi rimuovere il documento direttamente con il .remove()metodo piuttosto che trovare il documento e quindi rimuoverlo che mi sembra più efficiente e facile da mantenere.

Vedi esempio:

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

AGGIORNARE:

A partire da mangusta 3.8.1, esistono diversi metodi che ti consentono di rimuovere direttamente un documento, ad esempio:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

Per ulteriori informazioni, consultare i documenti API di mangusta .


13
Come notato in altri commenti ad altre risposte, questo ignora il middleware definito nello schema e può essere davvero pericoloso. Quindi usalo solo se capisci l'impatto che avrà. Per maggiori informazioni, vedi mongoosejs.com/docs/middleware.html
Jed Watson

2
Solo per la cronaca, fino ad ora li ho sempre usati senza effetti collaterali, certo, non ho dovuto usare alcun middleware nei miei progetti :)
Diosney,

8
remove(query)potrebbe potenzialmente svuotare l'intera raccolta in caso di passaggio accidentale query = {}. Per questo motivo preferisco findOneAndRemove(query)rimuovere un solo documento.
joeytwiddle,

1
Si noti inoltre che questo non restituisce una query, quindi né una promessa. Non puoi fareModel.remove({ _id: 'whatever' }).exec().then(...)
David,

48

docsè una matrice di documenti. quindi non ha un mongooseModel.remove()metodo.

È possibile iterare e rimuovere ogni documento nell'array separatamente.

Oppure - dato che sembra che tu stia trovando i documenti con un id (probabilmente) unico - usa findOneinvece di find.


5
Visto che questa risposta presuppone una versione piuttosto vecchia di mangusta, non mi opporterei davvero a qualcuno che cambi la risposta accettata.
mtkopone,

Questo è in realtà uno dei modi migliori per farlo perché richiama correttamente il middleware definito sullo schema - consultare mongoosejs.com/docs/middleware.html . Dovresti usare gli altri metodi solo se NON usi il middleware nella tua applicazione, e quindi con cautela.
Jed Watson,

41

Questo per me è il migliore dalla versione 3.8.1:

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

E richiede solo una chiamata DB. Usa questo dato che non esegui alcuna removeazione per la ricerca e la rimozione.


1
Finché non è necessario eseguire pre 'remove'azioni, funziona bene.
Daniel Kmak,

32

Semplicemente

FBFriendModel.remove().exec();

1
Semplice ed efficace
Rich Apodaca,

1
Questo restituisce una promessa? In tal caso, quale oggetto viene definito quando la Promessa viene risolta?
Kenny Worden,

@KennyWorden un approccio efficace per trovare la risposta -> mongoosejs.com/docs/api.html quindi cerca quello che vuoi ma anteponi '#' alla ricerca in-page con il tuo browser come la ricerca su '#save' e tu vedrò che restituisce una promessa.
Jason Sebring,

3
Questa è una specie di risposta pericolosa senza mettere la condizione
dell'operazione

29

mongoose.model.find()restituisce un oggetto query che ha anche una remove()funzione.

Puoi anche usare mongoose.model.findOne(), se vuoi rimuovere solo un documento unico.

Altrimenti puoi seguire anche l'approccio tradizionale in cui hai prima recuperato il documento e poi rimosso.

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

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

Di seguito sono riportati i modi modelsull'oggetto che è possibile eseguire una delle seguenti operazioni per rimuovere i documenti:

yourModelObj.findOneAndRemove(conditions, options, callback)

yourModelObj.findByIdAndRemove(id, options, callback)

yourModelObj.remove(conditions, callback);

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

22

remove()è stato deprecato. Usa deleteOne(), deleteMany()o bulkWrite().

Il codice che uso

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

1
Questa risposta richiede sinceramente più voti. È ingiustamente posizionato nella parte inferiore della canna (perché non ha ottenuto una mezza decade di voti antiquati), ma è l'unica risposta che risolve il problema di:(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
Steven Ventimiglia,

18

Per generalizzare puoi usare:

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();
  });
});

Un altro modo per raggiungere questo obiettivo è:

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

18

Fai attenzione con findOne e rimuovi!

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

Il codice sopra rimuove TUTTI gli utenti denominati "Alice" anziché solo il primo .

A proposito, preferisco rimuovere documenti come questo:

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

O fornire un callback e omettere il exec ()

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


12

Se stai cercando un solo oggetto da rimuovere, puoi usarlo

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

    });

In questo esempio, Mongoose verrà eliminato in base alla corrispondenza di req.params.id.


Benvenuto in StackOverflow. La tua risposta è un duplicato di più risposte in questa discussione. Inoltre, dovresti sempre verificare la presenza di errori nei tuoi callback.
VtoCorleone,

9

.remove()funziona come .find():

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

9

Preferisco la notazione della promessa, dove è necessario ad es

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

7

Per rimuovere il documento, preferisco usare Model.remove(conditions, [callback])

Fare riferimento alla documentazione API per la rimozione: -

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

In questo caso, il codice sarà: -

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

Se si desidera rimuovere documenti senza attendere una risposta da MongoDB, non passare un callback, è necessario chiamare exec sulla query restituita

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

6

Puoi semplicemente utilizzare la query direttamente all'interno della funzione di rimozione, quindi:

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

6

Puoi sempre usare la funzione integrata 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

Aggiornamento: .remove()è ammortizzato ma funziona ancora per le versioni precedenti

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

Model.remove è obsoleto
Maxwell sc

2

utilizzando il metodo remove () è possibile rimuovere.

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

Model.remove è obsoleto
Maxwell sc

1
Maxwell sc, fai una richiesta di modifica e correggi. So che sei nuovo di SO, ma è molto più utile ripararlo che commentare che è ammortizzato. Forse potresti suggerire una modifica la prossima volta, o apportare una modifica da solo, e prendere un po 'di controllo sulla situazione ...
Joshua Michael Wagoner,

1

Questo ha funzionato per me, prova questo:

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.removeè deprecato
Maxwell sc

1

Come da Samyak Jain's Answer, uso Async Await

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

0

Mi piace molto questo modello nelle app Express / Mongoose compatibili asincrono / wait:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.