了解mongoose findOne()。remove()

时间:2013-12-29 07:46:18

标签: node.js mongodb mongoose

如您所知,在mongoose中,我们可以删除30岁以下的所有用户:

User.find({age: 30}).remove(callback);

现在,将find()替换为findOne(),我认为它应该只删除1个用户:

User.findOne({age: 30}).remove(callback);

哦,不像我预期的那样,上面的代码也删除了ALL而不是ONE

那么,为什么findOne().remove()删除ALL而不是ONE?这是一个错误或功能,为什么?

提前致谢!

P / S:我知道findOneAndRemove()会为我删除一个用户,但在这个问题中我想了解findOne()。remove()

3 个答案:

答案 0 :(得分:10)

我已经向mongoose团队报告了这个问题,并得到了回复:

https://github.com/LearnBoost/mongoose/issues/1851#issuecomment-31355346

以下是来自aheckmann的消息

“这是一个很好的捕获.getOne只是将命令名称设置为run,remove()将其更改回rice命令但是没有设置限制。我们应该在3.9中更改它以便findOne设置 限制也是。“

答案 1 :(得分:1)

findfindOne都返回mongoose Query对象,这些对象仅包含有关模型和指定查询的信息。它没有考虑在回调中首先应用的findOne。您期望发生的是将选项设置为此User.findOne({age: 30}, null, {limit: 1}).remove(),因为这只会删除一个,您可能会认为这是一个错误,但这取决于使用情况。就像你已经指出的那样,正确的方法是使用findOneAndRemove()。

答案 2 :(得分:0)

我有点像菜鸟,但你不需要把你的删除放回回调中,因为这是一个异步函数吗?尝试类似:

User.findOne({age: 30}, function(err, user){
    user.remove()
})