0

在 MongoDB 中是否有任何并发​​友好的方式来执行此操作:

仅当按字段排序的最后一个文档对于另一个字段具有不同的值时,我才想插入文档。目标是拥有一个只存储转换而不是所有原始值的集合。

例子 :

这是一个集合(带有人性化的时间戳):

{ "created" : 1000, "lastUpdate" : 1000, "status" : "HEALTHY" }
{ "created" : 2000, "lastUpdate" : 2000, "status" : "ILL" }
{ "created" : 3000, "lastUpdate" : 3000, "status" : "HEALTHY" }

然后假设我收到一个新状态A

{ timestamp: 9999, "status": "HEALTHY" }

万一A,没有status过渡,所以我想更新集合并具有以下内容:

{ "created" : 1000, "lastUpdate" : 1000, "status" : "HEALTHY" }
{ "created" : 2000, "lastUpdate" : 2000, "status" : "ILL" }
{ "created" : 3000, "lastUpdate" : 9999, "status" : "HEALTHY" }

但是,如果我收到B如下所示的新状态:

{ timestamp: 9999, "status": "ILL" }

我想注册一个新的status过渡,并在集合中保存一个新文档,因为B它与status最近更新的文档不同(具有timestamp === 3000status === "HEALTHY".

该集合将如下所示:

{ "created" : 1000, "lastUpdate" : 1000, "status" : "HEALTHY" }
{ "created" : 2000, "lastUpdate" : 2000, "status" : "ILL" }
{ "created" : 3000, "lastUpdate" : 3000, "status" : "HEALTHY" }
{ "created" : 9999, "lastUpdate" : 9999, "status" : "ILL" }

我能想到的就是制作一个findOne来获取最近更新的文档,然后是一个updateinsert取决于获取的文档和新接收到的对象之间的内存比较。但这不是并发友好的,因为另一个进程可能在我find和我的insert/update...之间插入了另一个文档。

是否有我不知道的模式或 mongo 功能可以使这成为可能?

4

1 回答 1

0

如果您要插入或更新文档并启用 MMAP 存储引擎,则存在集合级别锁定,在这种情况下您是安全的。但是如果您启用了wiredtiger 存储引擎,这种方法将会失败。

于 2015-09-23T16:31:36.777 回答