Mongo:仅在最后一个文档不同时插入

时间:2015-09-23 15:56:31

标签: mongodb concurrency database-concurrency

在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的{​​{1}}不同timestamp === 3000 {1}}和status === "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功能可以实现这一目标?

1 个答案:

答案 0 :(得分:0)

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