updateFirst方法并不总是保存对象

时间:2019-06-18 19:54:03

标签: spring mongodb spring-boot mongotemplate

Spring Mongo Template的

updateFirst 方法并不总是按预期更新mongo Db集合。

(更新请求由前端ui中的保存按钮触发,我们看到一条提示消息,提示按下保存按钮并完成请求后表已成功保存)

当很少有更新请求依次依次触发且更新之间没有间隔时,经过几次请求后,我可以看到数据不再更新,但是日志中没有错误。

下面是更新数据库的方法。

@Override
public void updateTable(Source source, Table table) {
    log.debug("updating existing table " + table.getTableId() + " on source " + source.getSourceId());
    source.setStatus(SourceStatus.InProcess);
    Query q = query(where("_id").is(source.getId()).and("deleted").is(false).and("tables._id").is(table.getId()));
    Update u = update("tables.$", table);
    u.set("lastModifiedAt", source.getLastModifiedAt()).set("lastModifiedBy",
            source.getLastModifiedBy()).set("errorInObject", source.isErrorInObject()).set(
            "errorInChildObject", source.isErrorInChildObject()).set("errors", source.getErrors()).set(
            "failedFields", source.getFailedFields()).set("status",source.getStatus());
    template.updateFirst(q, u, Source.class);
}

我已使用属性文件参数记录了在Spring Boot应用程序上触发到Mongo Db的查询,并且始终更新被触发的查询具有正确的值,但是

更新何时生效-在触发更新查询之前,有一条日志消息显示“将对象保存到数据库”。

当更新不起作用时–在触发更新查询后,有一条日志消息显示“将对象保存到数据库”,我认为它是将先前的更新而不是当前的更新写入DB更新。

MongoDB版本-2.6.7

Spring Mongo模板驱动程序版本-2.13.3

Spring Boot版本-v1.3.2.RELEASE

可以根据需要提供其他信息。

1 个答案:

答案 0 :(得分:0)

我试图深入研究问题,并发现当我向Db发射更新命令时,它们之间没有任何间隙,这会导致MongoDb的队列处理更新,而某些更新已被覆盖。 / p>

因此,在调用updateFirst方法之前,我已经为每个更新请求增加了500毫秒的延迟,并且现在可以始终保留更新,即使更新请求非常频繁,也有足够的时间来处理更新。 / p>