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

Mongodb Mongo:仅当最后一个文档不同时插入,mongodb,concurrency,database-concurrency,Mongodb,Concurrency,Database Concurrency,在MongoDB中是否有任何并发友好的方法可以做到这一点: 仅当按字段排序的最后一个文档对另一个字段具有不同的值时,我才希望插入文档。目标是拥有一个只存储转换而不是所有原始值的集合 例如: 以下是一个带有人性化时间戳的集合: { "created" : 1000, "lastUpdate" : 1000, "status" : "HEALTHY" } { "created" : 2000, "lastUpdate" : 2000, "status" : "ILL" } { "created" :

在MongoDB中是否有任何并发友好的方法可以做到这一点:

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

例如:

以下是一个带有人性化时间戳的集合:

{ "created" : 1000, "lastUpdate" : 1000, "status" : "HEALTHY" }
{ "created" : 2000, "lastUpdate" : 2000, "status" : "ILL" }
{ "created" : 3000, "lastUpdate" : 3000, "status" : "HEALTHY" }
那么假设我收到一个新的状态a:

在案例A中,没有状态转换,因此我希望更新集合并具有以下内容:

{ "created" : 1000, "lastUpdate" : 1000, "status" : "HEALTHY" }
{ "created" : 2000, "lastUpdate" : 2000, "status" : "ILL" }
{ "created" : 3000, "lastUpdate" : 9999, "status" : "HEALTHY" }
但是,如果我收到一个新的状态B,如下所示:

{ timestamp: 9999, "status": "ILL" }
{ "created" : 1000, "lastUpdate" : 1000, "status" : "HEALTHY" }
{ "created" : 2000, "lastUpdate" : 2000, "status" : "ILL" }
{ "created" : 3000, "lastUpdate" : 3000, "status" : "HEALTHY" }
{ "created" : 9999, "lastUpdate" : 9999, "status" : "ILL" }
我想注册一个新的状态转换,并在集合中保存一个新文档,因为B的状态与最新更新的文档的状态不同,后者的时间戳===3000,状态===Health

然后,集合将如下所示:

{ timestamp: 9999, "status": "ILL" }
{ "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以获取最近更新的文档,然后根据获取的文档和新接收的对象之间的内存比较进行更新或插入。但这不利于并发,因为另一个进程可能会在我的查找和插入/更新之间插入另一个文档


是否有我不知道的模式或mongo功能可以实现这一点?

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

我不确定您在说什么,但并发性问题不在查找和插入/更新操作中,我假设这些操作是原子操作。事实上,我的程序必须执行两个顺序操作查找、插入或更新,这会导致并发问题:没有任何东西可以保证运行两个数据库查询的程序不会暂停,即使两个操作之间只有几毫秒的间隔。