在 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 === 3000
和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
来获取最近更新的文档,然后是一个update
或insert
取决于获取的文档和新接收到的对象之间的内存比较。但这不是并发友好的,因为另一个进程可能在我find
和我的insert/update
...之间插入了另一个文档。
是否有我不知道的模式或 mongo 功能可以使这成为可能?