【问题标题】:How do I remove documents using Node.js Mongoose?如何使用 Node.js Mongoose 删除文档?
【发布时间】:2011-08-14 03:58:47
【问题描述】:
FBFriendModel.find({
    id: 333
}, function (err, docs) {
    docs.remove(); //Remove all the documents that match!
});

上述方法似乎不起作用。记录还在。

有人可以解决吗?

【问题讨论】:

    标签: javascript node.js mongodb express authentication


    【解决方案1】:

    如果您不想迭代,请尝试

    FBFriendModel.find({ id:333 }).remove( callback );
    

    FBFriendModel.find({ id:333 }).remove().exec();
    

    mongoose.model.find 返回一个Query,它有一个remove function

    Mongoose v5.5.3 的更新 - remove() 现已弃用。 使用 deleteOne()deleteMany()findOneAndDelete() instead.

    【讨论】:

    • 这是在删除中间件之前/之后运行吗? (一些模型方法绕过了文档中间件,我不确定这是否是其中之一,文档不清楚)
    • 我想@hunterloftis 已经知道了这一点,但对于其他阅读答案是否定的人来说,这不会在单个文档上运行前/后中间件。
    • 这似乎很多其他答案都提到了.exec(),但这根本没有。是否需要.exec(),使用有没有副作用?
    • 文档很清楚(也许它们已经更新),这绕过了中间件 - 请参阅mongoosejs.com/docs/middleware.html 的底部 - 所以要小心,使用这种方法可能会导致严重的、难以追踪的问题。
    • 很好的答案!回调的参数是什么?
    【解决方案2】:

    更新:猫鼬版本 (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 docs 了解更多信息。

    【讨论】:

    • 正如其他 cmets 对其他答案所指出的那样,这绕过了在架构上定义的中间件,并且可能非常危险。因此,只有在您了解将产生的影响时才使用它。有关详细信息,请参阅mongoosejs.com/docs/middleware.html
    • 只是为了记录,直到现在我一直使用它们没有任何副作用,当然,我没有在我的项目中使用任何中间件:)
    • 如果您不小心传递了query = {}remove(query) 可能会清空您的整个收藏。因此,如果我只删除 一个 文档,我更喜欢 findOneAndRemove(query)
    • 另请注意,这不是返回查询,因此也不是承诺。你不能Model.remove({ _id: 'whatever' }).exec().then(...)
    【解决方案3】:

    docs 是一个文档数组。所以它没有mongooseModel.remove() 方法。

    您可以单独迭代和删除数组中的每个文档。

    或者 - 因为看起来您是通过(可能)唯一 ID 查找文档 - 使用 findOne 而不是 find

    【讨论】:

    • 看到这个答案假设是一个相当旧的猫鼬版本,我真的不反对有人改变接受的答案。
    • 这实际上是最好的方法之一,因为它正确地调用了在模式上定义的中间件 - 请参阅mongoosejs.com/docs/middleware.html。如果您的应用程序中没有使用中间件,您应该只使用其他方法,然后谨慎使用。
    【解决方案4】:

    这对我来说是 3.8.1 版中最好的:

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

    而且它只需要一个数据库调用。 鉴于您在搜索和删除之前没有执行任何 remove 操作,请使用此选项。

    【讨论】:

    • 只要您不需要执行pre 'remove' 操作,它就可以正常工作。
    【解决方案5】:

    remove() 已被弃用。使用deleteOne()deleteMany()bulkWrite()

    我使用的代码

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

    【讨论】:

    • 这个答案确实需要更多的支持。它被不公平地置于桶底(因为它还没有获得五年过时的选票),但它是解决问题的唯一答案:(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
    【解决方案6】:

    简单地做

    FBFriendModel.remove().exec();
    

    【讨论】:

    • 这会返回一个 Promise 吗?如果是这样,当 Promise 被解析时,定义了什么对象?
    • @KennyWorden 一种找到答案的有效方法 -> mongoosejs.com/docs/api.html 然后搜索您想要的内容,但使用浏览器在页内搜索前添加“#”,例如搜索“#save”你会看到它返回了一个承诺。
    • 这是一个危险的答案,没有将条件放在删除中指定的操作...
    【解决方案7】:

    mongoose.model.find() 返回一个Query Object,它也有一个remove() 函数。

    如果您只想删除一个唯一文档,也可以使用mongoose.model.findOne()

    否则,您也可以遵循传统方法,首先检索文档然后删除。

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

    【讨论】:

      【解决方案8】:

      为了概括,您可以使用:

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

      【讨论】:

        【解决方案9】:

        小心使用 findOne 并删除!

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

        上面的代码删除了所有名为“Alice”的用户,而不仅仅是第一个

        顺便说一句,我更喜欢删除这样的文档:

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

        或者提供回调并省略 exec()

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

        【讨论】:

          【解决方案10】:
          model.remove({title:'danish'}, function(err){
              if(err) throw err;
          });
          

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

          【讨论】:

            【解决方案11】:

            如果你只寻找一个要移除的对象,你可以使用

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

            在本例中,Mongoose 将根据匹配的 req.params.id 进行删除。

            【讨论】:

            • 欢迎来到 Stackoverflow。您的答案与此线程中的多个答案重复。此外,您应该始终检查回调中的错误。
            【解决方案12】:

            .remove().find() 类似:

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

            【讨论】:

              【解决方案13】:

              我更喜欢 promise 表示法,例如您需要的地方

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

              【讨论】:

                【解决方案14】:

                对于删除文档,我更喜欢使用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响应的情况下删除文档,不传递回调,那么你需要在返回的Query上调用exec

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

                【讨论】:

                  【解决方案15】:

                  你可以直接在 remove 函数中使用查询,所以:

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

                  【讨论】:

                    【解决方案16】:

                    您始终可以使用 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;
                        });
                    

                    【讨论】:

                      【解决方案17】:

                      更新:.remove() 已弃用,但这仍然适用于旧版本

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

                      【讨论】:

                      • Model.remove 已弃用
                      【解决方案18】:

                      我真的很喜欢async/await capable 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)
                      }))
                      

                      【讨论】:

                        【解决方案19】:

                        使用 remove() 方法可以删除。

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

                        【讨论】:

                        • Model.remove 已弃用
                        • Maxwell s.c,然后提出编辑请求,并更正。我知道您是 SO 新手,但修复它比评论它已贬值更有帮助。也许您可以建议下次进行编辑,或者自己进行编辑,并对情况有所掌控......
                        【解决方案20】:

                        根据 Samyak Jain 的回答,我使用 Async Await

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

                        【讨论】:

                          【解决方案21】:

                          这对我有用,试试这个:

                          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 已弃用
                          【解决方案22】:

                          要删除单个文档,您可以使用 deleteOne() 或 remove() with single:true 和 deleteMany() 或 remove() 来删除多个文档:-

                          1. 使用 deleteOne()
                              syntax
                              Model.deleteOne({conditions},function(err){});
                          
                              Example
                               Model.deleteOne({title:"hi"},function(err){
                                  if(err)
                                  {
                                      res.send(err);
                                  }
                                  else{
                                      res.send("deleted");
                                  }
                              });
                          

                          2.使用remove()

                              syntax
                              Model.remove({conditions},{single:true},function(err){});
                          
                              Example
                               Model.remove({title:"hi"},{single:true},function(err){
                                  if(err)
                                  {
                                      res.send(err);
                                  }
                                  else{
                                      res.send("deleted");
                                  }
                              });
                          

                          3.使用 deleteMany()

                          syntax
                          Model.deleteMany({conditions},function(err){});
                          
                              Example
                               Model.deleteMany({title:"hi"},function(err){
                                  if(err)
                                  {
                                      res.send(err);
                                  }
                                  else{
                                      res.send("deleted");
                                  }
                              });
                          
                          1. 使用 remove()
                           syntax
                              Model.remove({conditions},function(err){});
                          
                              Example
                               Model.remove({title:"hi"},function(err){
                                  if(err)
                                  {
                                      res.send(err);
                                  }
                                  else{
                                      res.send("deleted");
                                  }
                              });
                          

                          【讨论】:

                            【解决方案23】:

                            如果您知道文档的_id,您可以使用findByIdAndDelete(id),这是findOneAndDelete({ _id: id }) 的简写。

                            import Question from '../models/Question';
                            
                            const deleteQuestion = (questionId: string) => {
                                try {
                                    Question.findByIdAndDelete(questionId);
                                } catch (e) {
                                    console.error(e);
                                }
                            };
                            

                            这里questionId 是documentId (_id)

                            【讨论】:

                              【解决方案24】:
                              db.collection.remove(<query>,
                               {
                                justOne: <boolean>,
                                writeConcern: <document>
                              })
                              

                              【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2014-05-01
                              • 2020-01-31
                              • 2020-07-29
                              • 1970-01-01
                              • 2019-01-01
                              • 2021-12-28
                              • 1970-01-01
                              相关资源
                              最近更新 更多