猫鼬中的 findByIdAndRemove 和 findByIdAndDelete 有啥区别?

Posted

技术标签:

【中文标题】猫鼬中的 findByIdAndRemove 和 findByIdAndDelete 有啥区别?【英文标题】:What is the difference between findByIdAndRemove and findByIdAndDelete in mongoose?猫鼬中的 findByIdAndRemove 和 findByIdAndDelete 有什么区别? 【发布时间】:2019-06-02 12:21:29 【问题描述】:

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

【问题讨论】:

【参考方案1】:

MongoDB 正在更新其方法,就像任何其他编码语言或程序一样。正如你在这里看到的:https://mongoosejs.com/docs/deprecations.html

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

我猜 findByIdAndRemove() 还没有被弃用,但可能它也将被弃用,以便转换为仅删除方法。

【讨论】:

【参考方案2】:

他们的评论没有区别。

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

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

【讨论】:

【参考方案3】:

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

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

// Note: same signatures as findByIdAndRemove

findByIdAndRemove()一样:

// Note: same signatures as findByIdAndDelete

【讨论】:

拥有相同的签名并不一定意味着他们做同样的事情。例如,以下两个函数具有相同的签名,但做的事情却大不相同:const add = (a, b) => a + b;const multiply = (a, b) => a * b; 它们都具有相同的签名,因为它们每个都将两个数字作为参数并返回一个数字,但是一个是将这些数字相加并另一个是倍增他们 请深入源代码,不仅仅是符号,在我发布答案时,这两个函数的实现代码完全相同。 @凯蒂 @xirururu 是的,但他们的观点是两个函数具有相同的签名并不意味着函数做同样的事情,正如答案所推断的那样。 @AmirAsyraf 我的意思是 javascript 代码实现 是完全相同的,至少在我回答问题时是这样。请深入源码!如果它们不同,请发布并告诉我们! @xirururu 看,我知道代码是一样的。但是您发布的答案暗示它们是相同的,只是因为它们具有相同的签名。例如// Note: same signatures as findByIdAndRemove。如果您改为发布代码块,或者只是提到代码完全相同,就不会有任何争论。【参考方案4】:

此函数与 Model.findOneAndRemove() 略有不同,因为 findOneAndRemove() 变成了 MongoDB findAndModify() 命令,而不是 findOneAndDelete() 命令。对于大多数猫鼬用例,这种区别纯粹是迂腐的。你应该使用 findOneAndDelete() 除非你有充分的理由不这样做。

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

【讨论】:

什么是“不”使用findOneAndDelete的“充分理由”? “除非你有充分的理由不使用,否则你应该使用 findOneAndDelete()”——回答了我的问题。谢谢。

以上是关于猫鼬中的 findByIdAndRemove 和 findByIdAndDelete 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬中的用户、帖子和评论模型

猫鼬中的最小和最大数量验证

猫鼬中的填充方法(节点js)

猫鼬中的填充方法(节点js)

删除猫鼬中的评论父母

将元素推送到猫鼬中的数组