如您所知,在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()
答案 0 :(得分:10)
我已经向mongoose团队报告了这个问题,并得到了回复:
https://github.com/LearnBoost/mongoose/issues/1851#issuecomment-31355346
以下是来自aheckmann的消息
“这是一个很好的捕获.getOne只是将命令名称设置为run,remove()将其更改回rice命令但是没有设置限制。我们应该在3.9中更改它以便findOne设置 限制也是。“
答案 1 :(得分:1)
find
和findOne
都返回mongoose Query对象,这些对象仅包含有关模型和指定查询的信息。它没有考虑在回调中首先应用的findOne
。您期望发生的是将选项设置为此User.findOne({age: 30}, null, {limit: 1}).remove()
,因为这只会删除一个,您可能会认为这是一个错误,但这取决于使用情况。就像你已经指出的那样,正确的方法是使用findOneAndRemove()。
答案 2 :(得分:0)
我有点像菜鸟,但你不需要把你的删除放回回调中,因为这是一个异步函数吗?尝试类似:
User.findOne({age: 30}, function(err, user){
user.remove()
})