mongoose中findByIdAndRemove和findByIdAndDelete有什么区别?

73

这里的文档并没有为什么有两个不同的操作来完成同一件事提供太多解释,所以我想知道它们之间的区别是什么。为什么我会选择使用其中一个而不是另一个?

8个回答

50

这个函数与Model.findOneAndRemove()稍有不同,因为findOneAndRemove()变成了一个MongoDB的findAndModify()命令,而不是一个findOneAndDelete()命令。对于大多数mongoose使用情况来说,这种区别仅仅是纯粹的学究派。除非你有充分的理由不用,否则应该使用findOneAndDelete()。

官方网站https://mongoosejs.com/docs/api.html#model_Model.findOneAndDelete


47
什么情况下使用findOneAndDelete不是一个“好的理由”? - Katie
3
"除非你有充分的理由不这样做,否则应该使用findOneAndDelete()。" - 这回答了我的问题。谢谢。 - Mr.spShuvo

23

它们之间没有区别!^_^

让我们来看看代码,在findByIdAndDelete()中,有一个注释:

// Note: same signatures as findByIdAndRemove

通过findByIdAndRemove()同样可以实现:

// Note: same signatures as findByIdAndDelete

8
拥有相同的签名并不一定意味着它们做的事情相同。例如,以下两个函数具有相同的签名,但执行非常不同的任务:const add = (a, b) => a + b; const multiply = (a, b) => a * b;它们具有相同的签名,因为它们都接受两个数字作为参数并返回一个数字,但一个是将这些数字相加,而另一个是将它们相乘。 - Katie
1
请深入源代码,不仅仅是注释。在我发布答案时,这两个函数具有完全相同的实现代码。@Katie - xirururu
1
@xirururu 是的,但他们的观点是两个具有相同签名的函数并不意味着这些函数做的事情相同,正如答案所推断的那样。 - Amir Asyraf
@AmirAsyraf 我的意思是 Javascript 代码实现 在我回答这个问题时是完全相同的。请深入源代码!如果它们不同,请发布并让我们知道! - xirururu
@xirururu,我知道代码是/曾经是相同的。但是你发布的答案暗示它们之间只是因为具有相同的签名而相同。例如:// 注意:与findByIdAndRemove具有相同的签名。如果你发布了代码块或者只是提到这些代码完全相同,就不会有任何争议了。 - Amir Asyraf

13

MongoDB正在更新其方法,就像任何其他编程语言或程序一样。您可以在此处查看:https://mongoosejs.com/docs/deprecations.html

remove()和findOneAndRemove()已被废弃,取而代之的是deleteOne()和deleteMany()。

我猜findByIdAndRemove()目前还没有被废弃,但很可能也会被废弃以过渡到仅删除方法。


3

我明白了原因:findByIdAndRemove返回已删除的文档,而findByIdAndDelete则不返回。 如果我们需要已删除的文档,则可以使用findByIdAndRemove;否则,可以使用findByIdAndDelete。

建议: 如果不需要获取已删除的文档,则必须使用findByIdAndDelete,因为它快速且不返回文档。


3

两者的备注没有任何区别。

如果有,这两个函数都会返回找到的文档。

// Finds a matching document, removes it, passing the found document (if any) to the callback.

1
看起来findByIdAndRemove()在从Mongoose 7.x过渡到8.x(于2023年10月31日发布)时被弃用(并且无法正常工作)。尽管如此,我在https://mongoosejs.com/docs/migrating_to_8.html中没有看到有关该方法被移除的说明。

0

这个函数与Model.findOneAndRemove()略有不同,findOneAndRemove()会变成一个MongoDBfindAndModify()命令,而不是findOneAndDelete()命令。对于大多数mongoose用例来说,这种区别纯粹是学究式的。除非你有充分的理由,否则应该使用findOneAndDelete()

阅读更多: docs


3
你刚才是不是复制粘贴了另一个答案? :)) - M.Ionut

-1

通过文档的 _id 字段发出 MongoDB findOneAndDelete() 命令。换句话说,findByIdAndDelete(id) 是 findOneAndDelete({ _id: id }) 的简写。

通过文档的 _id 字段发出 mongodb findAndModify remove 命令。findByIdAndRemove(id, ...) 等同于 findOneAndRemove({ _id: id }, ...)。


哥们,欢迎来到Stackoverflow。你刚才复制粘贴的内容我们已经在问题链接中的文档里知道了。 - ksugiarto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接