如何使用 Node.js Mongoose 删除文档?

IT技术 javascript node.js mongodb express authentication
2021-01-21 22:58:15
FBFriendModel.find({
    id: 333
}, function (err, docs) {
    docs.remove(); //Remove all the documents that match!
});

以上似乎不起作用。记录还在。

有人可以修复吗?

6个回答

如果您不想迭代,请尝试

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

或者

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

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

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

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

更新: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 文档

正如其他答案的其他评论中所指出的,这绕过了在架构上定义的中间件,并且可能非常危险。因此,只有在您了解将产生的影响时才使用它。有关更多信息,请参阅mongoosejs.com/docs/middleware.html
2021-03-14 22:58:15
remove(query)如果您不小心通过了,可能会清空您的整个收藏query = {}出于这个原因,我更喜欢findOneAndRemove(query)只删除一个文档。
2021-03-20 22:58:15
只是为了记录,直到现在我一直使用它们没有任何副作用,当然,我没有在我的项目中使用任何中间件:)
2021-03-26 22:58:15
另请注意,这不会返回查询,因此也不会返回Promise。不能Model.remove({ _id: 'whatever' }).exec().then(...)
2021-04-11 22:58:15

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

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

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

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

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

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

它只需要一次数据库调用。考虑到您remove在搜索和删除之前不执行任何操作,请使用此选项。

只要您不需要执行pre 'remove'操作,它就可以正常工作。
2021-03-28 22:58:15

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.
2021-04-08 22:58:15