如何使用 Node.js Mongoose 删除文档?
Posted
技术标签:
【中文标题】如何使用 Node.js Mongoose 删除文档?【英文标题】:How do I remove documents using Node.js Mongoose? 【发布时间】:2011-08-14 03:58:47 【问题描述】:FBFriendModel.find(
id: 333
, function (err, docs)
docs.remove(); //Remove all the documents that match!
);
上述方法似乎不起作用。记录还在。
有人可以解决吗?
【问题讨论】:
【参考方案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 进行删除。
【讨论】:
欢迎来到 ***。您的答案与此线程中的多个答案重复。此外,您应该始终检查回调中的错误。【参考方案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() 来删除多个文档:-
-
使用 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");
);
-
使用 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>
)
【讨论】:
@M.R.:当答案中没有链接时,它怎么可能是仅链接的?另请查看:Low quality posts and code only answers 抱歉误点击。但仍然是低质量。以上是关于如何使用 Node.js Mongoose 删除文档?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Node.js Express Mongoose 删除列表项
考虑到 Mongoose Node.js 中的引用,如何删除对象?
在 Mongoose (mongodb node.js) 中,如何更新现有值并插入缺失值,而不删除未指定的值?