在 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 功能可以使这成为可能?