测试 findOneAndUpdate upsert 重复预防

Posted

技术标签:

【中文标题】测试 findOneAndUpdate upsert 重复预防【英文标题】:Testing findOneAndUpdate upsert duplicate prevention 【发布时间】:2018-05-09 06:44:00 【问题描述】:

您好,我有一个节点 js 代码,它使用带有 Upsert = true 的 findOneAndUpdate 来创建一个新的 mongodb 文档(如果不存在)。

我想测试两个异步线程是否同时调用我的代码,然后它会创建重复。

这甚至可以测试吗?我怎样才能做到这一点。我是测试初学者。

【问题讨论】:

【参考方案1】:

文档级并发

WiredTiger 使用文档级并发控制进行写入 操作。因此,多个客户端可以修改不同的 一个集合的文档。

对于大多数读写操作,WiredTiger 使用乐观 并发控制。 WiredTiger 仅在全局使用意图锁, 数据库和集合级别。当存储引擎检测到 两个操作之间的冲突,一个会导致写冲突 导致 MongoDB 透明地重试该操作。

一些全局操作,通常是短暂的操作,涉及 多个数据库,仍然需要全局“实例范围”锁。一些 其他操作,例如删除集合,仍然需要 独占数据库锁。

Document Level Concurrency

并且在单个集合中,相同的 _id 永远不会存在 _id 上具有唯一索引,因此即使您解释的情况发生,将执行的第一个查询将创建一个新文档,后面的查询将更新它.

【讨论】:

重复我的意思是创建两个文档,使用不同的 id 和相同的数据值。 docs.mongodb.com/manual/reference/method/… 在 Upsert 和唯一索引上查看此链接段落。 好的,我以为你只是通过匹配 _id 来更新。在您的情况下,如果您尝试匹配更新的字段不是唯一索引的,您最终可能会得到重复的文档。 是的,是的,我让它们独一无二,只是想知道我是否可以测试一下。

以上是关于测试 findOneAndUpdate upsert 重复预防的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose `findOneAndUpdate` 回调不传递更新的文档

findOneAndUpdate 导致重复问题

MongoDB中updateOne超过findOneAndUpdate的用例[重复]

如何在mongo中进行索引后findOneAndUpdate()的性能评估

Mongoose findOneAndUpdate 更新多个字段

Mongoose - 使用 findOneAndUpdate 更新子文档