Node.js Mongooseを使用してドキュメントを削除するにはどうすればよいですか?


回答:


489

繰り返したくない場合はFBFriendModel.find({ id:333 }).remove( callback );FBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.find関数を持つクエリを返します。remove

Mongoose v5.5.3の更新- remove()廃止されました。使用deleteOne()deleteMany()またはfindOneAndDelete() instead.


3
これは削除前/削除後のミドルウェアを実行しますか?(一部のモデルメソッドはドキュメントミドルウェアをバイパスし、これがそれらの1つであるかどうかは
わかり

12
私は@hunterloftisがすでにこれを理解していると思いますが、他の誰もが答えを読んでいなければ、これは個々のドキュメントで事前/事後ミドルウェアを実行しません。
numbers1311407 2013年

これは他の回答の多くが言及しているようですが、.exec()これはまったくしていません。される.exec()必要な、それを使用したりしないようにそこに副作用はありますか?
DanH 14

ドキュメントは明らかです(たぶん更新されている可能性があります)。これによりミドルウェアがバイパスされます-mongoosejs.com/docs/middleware.htmlの下部を参照してください。この方法を使用すると、深刻で追跡が難しい問題を引き起こす可能性があるので注意してください。
Jed Watson

1
すばらしい答えです!コールバックの引数は何ですか?
k88074

299

更新:Mongooseバージョン(5.5.3)

remove()は非推奨であり、代わりにdeleteOne()、deleteMany()、またはbulkWrite()を使用できます。

現在"mongoose": ">=2.7.1"、ドキュメントを直接削除できます.remove()見つけてなくメソッドこれは、より効率的でメンテナンスが簡単に思えます。

例を参照してください:

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

更新:

mongooseの時点で3.8.1、ドキュメントを直接削除できるいくつかの方法があります。

  • remove
  • findByIdAndRemove
  • findOneAndRemove

詳細については、mongoose APIドキュメントを参照してください。


13
他の回答に対する他のコメントで述べたように、これはスキーマで定義されているミドルウェアをバイパスするため、非常に危険な場合があります。そのため、その影響を理解している場合にのみ使用してください。詳細については
Jed Watson

2
参考

8
remove(query)誤ってを渡すと、コレクション全体が空になる可能性がありますquery = {}。そのため、ドキュメントを1つfindOneAndRemove(query)だけ削除するのが好きです。
joeytwiddle 2016

1
また、これはクエリを返さないため、promiseも返されないことに注意してください。あなたはできませんModel.remove({ _id: 'whatever' }).exec().then(...)
デビッド・

48

docsドキュメントの配列です。だからそれはありませんmongooseModel.remove()メソッド。

配列内の各ドキュメントを個別に反復して削除できます。

または、ドキュメントを(おそらく)一意のIDで検索しているように見えるため、findOneではなくを使用してくださいfind


5
この回答はマングースのかなり古いバージョンを想定しているので、受け入れられた回答を変更する人に反対することはありません。
mtkopone 2014年

それは正しく呼び出すが、スキーマで定義されたミドルウェアので、これは実際にそれを行うための最善の方法の一つです-参照mongoosejs.com/docs/middleware.htmlを。アプリケーションでミドルウェアを使用していない場合にのみ、他の方法を使用する必要があります。
Jed Watson

41

これはバージョン3.8.1の時点で最高です。

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

また、必要なDB呼び出しは1つだけです。remove検索と削除よりも先にアクションを実行しない場合は、これを使用してください。


1
pre 'remove'アクションを実行する必要がない限り、問題なく動作します。
Daniel Kmak

32

単に行う

FBFriendModel.remove().exec();

1
シンプルで効果的。
リッチアポダカ2013年

1
これは約束を返しますか?その場合、約束が解決されたときにどのオブジェクトが定義されますか?
ケニーワーデン、2016

答えを見つけるための効果的なアプローチを@KennyWorden - > mongoosejs.com/docs/api.htmlは、このような「#save」に関する検索とあなたとあなたのブラウザで、あなたが望むものを検索しますが、ページ内検索にプリペンド「#」それが約束を返すのがわかるでしょう。
Jason Sebring

3
これは、削除で指定された操作の条件を指定しないと危険な答えになります...
blak3r

29

mongoose.model.find()関数も持つクエリオブジェクトを返しますremove()

mongoose.model.findOne()一意のドキュメントを1つだけ削除する場合にも使用できます。

それ以外の場合は、最初にドキュメントを取得してから削除する従来のアプローチに従うこともできます。

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

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

以下は、modelオブジェクトを削除してドキュメントを削除する方法です。

yourModelObj.findOneAndRemove(conditions, options, callback)

yourModelObj.findByIdAndRemove(id, options, callback)

yourModelObj.remove(conditions, callback);

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

22

remove()廃止されました。使用deleteOne()deleteMany()またはbulkWrite()

私が使用するコード

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

1
この回答には正直にもっと賛成票が必要です。それはバレルの底に不当に配置されています(古くなった投票の半十年を獲得していないためです)が、次の問題を解決する唯一の答えです:(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
スティーブン・ヴェンティミリア

18

一般化するには、以下を使用できます。

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

これを実現する別の方法は次のとおりです。

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

18

findOneに注意して削除してください!

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

上記のコードは、最初のユーザーだけでなく、「Alice」という名前のすべてのユーザーを削除します。

ちなみに、私はこのようなドキュメントを削除することを好みます:

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

または、コールバックを提供し、exec()を省略します

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


12

削除するオブジェクトを1つだけ探している場合は、

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

    });

この例では、Mongooseは一致するreq.params.idに基づいて削除します。


Stackoverflowへようこそ。あなたの答えは、このスレッドの複数の答えの複製です。また、コールバックのエラーを常に確認する必要があります。
VtoCorleone

9

.remove()のように動作し.find()ます:

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

9

私はあなたが必要とする場合の約束の表記を好みます

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

7

ドキュメントを削除するには、私は Model.remove(conditions, [callback])

削除については、APIドキュメントを参照してください:-

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

この場合、コードは次のようになります:-

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

MongoDBからの応答を待たずにドキュメントを削除する場合は、コールバックを渡さないでください。返されたクエリでexecを呼び出す必要があります。

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

6

remove関数内で直接クエリを使用できるため、次のようになります。

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

6

いつでも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

更新:.remove()廃止予定ですが、これは古いバージョンでも機能します

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

Model.removeは非推奨
Maxwell sc

2

削除できるremove()メソッドを使用します。

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

Model.removeは非推奨
Maxwell sc

1
Maxwell sc、編集リクエストをして修正します。私はあなたがSOに慣れていないことを知っていますが、減価償却されているとコメントするよりも修正する方がはるかに役立ちます。たぶん、次回編集を提案するか、自分で編集して、状況の少しの所有権を取ることができます...
ジョシュアマイケルワゴナー

1

これは私にとってはうまくいきました、これを試してください:

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は非推奨
Maxwell sc


0

私は非同期/待機可能な Express / Mongooseアプリでこのパターンを本当に気に入っています:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.