findOneAndDelete()和findOneAndRemove()之间的区别

时间:2018-05-30 10:12:01

标签: mongodb express mongoose

我无法区分findOneAndDelete()中的findOneAndRemove()mongoose documentaion

  

Query.prototype.findOneAndDelete()

     

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

8 个答案:

答案 0 :(得分:1)

在MongoDB本机客户端(猫鼬不同)中,将{ remove: true }传递给findAndModify使其删除找到的文档,这种情况下的行为与findOneAndDelete非常相似。 但是,使用其他选项时会有一些区别:

  • findAndModify采用5个参数:querysortdoc(更新对象),optionscallbackfindOneAndDelete只需要3(filter或查询,options和一个callback
  • 用于options
  • findAndModify包括wwtimeoutj用于写问题,例如:

      

    “ MongoDB请求对独立mongod或副本集或分片集群进行写操作的确认级别。”或仅保证可用于报告写操作成功的级别。

    options

    findOneAndDelete不包括写关注配置。

  • findAndModify可让您返回新文档并同时将其删除。

示例:

// Simple findAndModify command returning the new document and
  // removing it at the same time
  collection.findAndModify({b:1}, [['b', 1]], {$set:{deleted: Date()}}, {remove:true}, calback)

答案 1 :(得分:1)

这里的其他答案有很多错误信息。它们在所有意图和目的上都是相同的,您应该只使用findOneAndDelete()

猫鼬的Model.findOneAndRemove(query)成为MongoDB的findAndModify({query, remove: true})

猫鼬的Model.findOneAndDelete()成为MongoDB的findOneAndDelete()。但是,MongoDB驱动程序将findOneAndDelete(query, opts)转换为findAndModify({query, remove: true})src)。因此,它们在数据库中执行完全相同的操作。

两者的选择相同。

两者都返回已删除的文档。

答案 2 :(得分:0)

在猫鼬中,findOneAndDelete的工作方式与findOneAndRemove相同。它们都通过JSON中的属性查找对象,然后继续删除它,并在删除后返回对象。当您将本机mongodb用作数据库时,findOneAndDelete可能对您有用,但在猫鼬不推荐使用的情况下,我建议您使用findOneAndDelete来基于此时的最新mongoose和nodejs配置执行操作。 https://github.com/Automattic/mongoose/issues/6880

答案 3 :(得分:0)

我建议您使用findOneAndDelete()。 Mongoose既提供了使用ORM处理数据的功能,又提供了直接写入数据库的功能,其中findOneAndDelete()是后者之一。直接写入数据库更加危险,因为您可能会面临不调用中间件或验证程序的风险,从而有可能向数据库提交部分或不完整的数据。请注意,我说这是 more 危险,而不是完全危险,findOneAndDelete()贯穿整个ORM,增加了安全性。

答案 4 :(得分:0)

findOneAndRemove返回已删除的文档,因此,如果删除了以后决定不删除的文档,则可以将其重新插入数据库。在删除文档之前,请确保逻辑合理,而不是在事后检查IMO。

findOneAndDelete具有sort参数,可用于影响哪个文档被更新。它还具有一个TimeLimit参数,该参数可以控制必须完成的操作

答案 5 :(得分:0)

除了 findOneAndRemove 使用带有删除标志的 findAndModify 之外,这两者几乎相似,与 findOneAndDelete 相比,时间复杂度要高一些,因为正在更新。删除总是更快。

答案 6 :(得分:0)

它们都做相同的事情(从mongodb数据库中删除文档),但是它们之间几乎没有区别,并且共同的有用区别是findOneAndRemove()返回删除的文档(如果您有兴趣在之后使用它)它已删除。

答案 7 :(得分:0)

TLDR:除非有充分理由不这样做,否则应使用findOneAndDelete()。


更长的答案:

来自findOneAndDelete的Mongoose文档:

  

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

Mongoose Docs findOneAndDelete