如何在MongoDB中使用findOneAndUpdate方法

1,355 阅读3分钟

MongoDB支持多种功能,用于处理数据库中的数据。在任何数据库中,数据更新过程都是不可避免的,而且是频繁进行的。findOneAndUpdate方法用于更新符合条件的单个文档,该方法是MongoDB的核心更新方法的扩展。

findOneAndUpdate()方法在更新后返回文档,而MongoDB的updateOne() 方法也更新一个文档,但它不返回任何文档。

在这篇文章中,你将学习如何理解和应用MongoDB的findOneAndUpdate**()**方法来匹配和更新单个文档。

findOneAndUpdate()在MongoDB中是如何工作的

这个方法的工作机制是基于下面给出的语法。

db.collection-name.findOneAndUpdate({filter}, {update}, {options})

在上面的语法中。

collection-name 指的是文档所在的Mongo数据库的集合。

{filter} 是一个匹配文档的条件。

{update} 包含要更新的字段和相关值

{options} 是细化更新处理的参数。例如,"maxTimeMS"选项是用来限制查询的执行时间的。如果超过了指定的时间限制,查询将不会被执行。

如何在MongoDB中应用findOneAndUpdate()方法

在本节中,我们将通过几个例子来详细指导如何使用 findOneAndUpdate() 方法。

例子1:更新一个文档

在这个例子中,我们将使用一个 "laptops"集合,其中有以下内容。

> db.laptops.find().pretty()

Text Description automatically generated

我们想在 "单位"值大于或等于 "50"的文档中添加一个**"状态 "** 字段,其值为 "可用"。下面提到的命令将在findOneAndUpdate() 方法的帮助下执行上述的更新。

> db.laptops.findOneAndUpdate({"Units": {$gte: 50}}, {$set: {"Status": "available"}})

Text Description automatically generated

从上述输出中得出以下观察结果。

findOneAndUpdate() 方法返回了原始文档(更新前)。

由于有两个文件的 "单位"值大于或等于 "50",但findOneAndUpdate() 方法考虑了第一个符合条件的文件。

你可以通过使用下面提到的命令来验证更新:可以注意到只有一个文档的字段 "Status"被添加。

> db.laptops.find().pretty()

Text Description automatically generated

例2:返回更新后的文档

默认情况下,findOneAndUpdate()方法返回原始文档。你可以通过设置 "returnNewDocument"选项的值为 "true"来获取更新后的文档作为回报。

下面写的命令将添加一个新的字段 "cat",其值被设置为 "Gaming"。更新将在 "价格"值等于1750的文件中执行。此外,"returnNewDocument"的值是 "true"。所以,它必须返回更新后的文档。

> db.laptops.findOneAndUpdate({"Price": 1750}, {$set: {"cat": "Gaming"}}, {returnNewDocument: true})

Text Description automatically generated

输出结果显示,上述命令返回的文档是一个更新的版本。

例3:使用带有选项的findOneAndUpdate()方法

这个方法支持多个选项,因为我们在 "例子2"中应用了 "returnNewDocument"选项。在本节中,我们将解释该方法支持的其他几个选项。

upsert: upsert"选项的值默认为false。而如果它被设置为 "true",findOneAndUpdate() 方法将在条件无法匹配任何文档时创建一个新的文档。

例如,下面提到的命令将寻找在laptops 集合中 "Make"值与 "Alien"匹配的文档。由于没有一个文档的字段值是 "Alien", 因此,一个新的文档将被创建,因为我们已经将 "upsert"值设置为 "true"。

注意: 我们也使用了 "returnNewDocument"选项来获得更新的文档。

> db.laptops.findOneAndUpdate({"Make": "Alien"}, {$set: {"Price": 1500,"cat": "Gaming"}}, {upsert: true, returnNewDocument: true})

Text Description automatically generated

maxTimeMS :该 选项用于限制更新命令的时间(以毫秒为单位)。如果超过了指定的时间限制,查询将返回一个错误。例如,我们在下面提到的命令中把 "maxTimeMS"选项设置为 "2"值。

> db.laptops.findOneAndUpdate({"Make": "Alien"}, {$set: {"Units": 15, "Price": 1850}}, {returnNewDocument: true, maxTimeMS: 2})

Text Description automatically generated

注意: "maxTimeMS"选项的值必须是数字(不是浮点或其他数据类型)。

总结

更新过程在任何数据库管理系统中都有一个关键的作用,因为在任何组织中,数据都需要及时更新。MongoDB使用了一些更新方法的扩展,比如findOneAndUpdate()。 在这个内容丰富的帖子中,我们提供了这个方法在MongoDB中的简要应用。这个目标方法根据条件匹配第一个文档,然后更新该文档的特定字段(s)。