当我使用spring数据在我的MongoDB上插入文档时,我执行以下操作:
Update update = new Update();
update.currentDate("lastModified");
mongoTemplate.upsert(query, update, MyDocument.class);我使用的是currentDate of MongoDB,因为我想用MongoDB数据库所在的日期保存MyDocument上一次修改的日期。
基于等级库
如果-修改-自请求-头字段与一种方法一起使用,以使其具有条件:如果请求的变量自该字段中指定的时间以来未被修改,则实体将不会从服务器返回;相反,将返回304 (未修改)响应,而不带任何消息体。
因此,保存此日期的目的是验证是否基于接收日期修改了MyDocument。
因此,当我执行更新时,将在数据库上创建以下IsoDate:
ISODate("2016-12-02T12:11:33.083Z")因此,当客户想知道文档是否已更改时,他们会将日期发回给我,然后我在数据库上查询:
Query query = new Query(where("id").is(filter.getId()));
Criteria criteria = Criteria.where("lastModified").gt(filter.getLastModified());
query.addCriteria(criteria);
return mongoTemplate.findOne(query, MyDocument.class);这是完美的,除了一个问题:规范说标头如果-修改-因为有以下格式:
如果-修改-自: Sat,1994年10月29日19:43:31格林尼治时间
这意味着毫秒不会传递给如果修改的-自标头。但是,MongoDB IsoDate用毫秒保存当前日期。因此,当两个日期完全相同时,查询将不会返回304未修改,但它将返回整个资源,因为查询如下:
{ "id" : 123, "lastModified" : { "$gt" : { $java : 2016-12-02T12:11:39.000Z } } }由于客户端不发送毫秒,所以java将毫秒设为零( 2016-12-02T12:11:39.000Z),,这意味着我的数据库上的日期大于客户机发送的日期:
2016-12-02T12:11:33.083Z > 2016-12-02T12:11:39.000Z
因为有83毫秒。
最后一个问题是:解决这个问题的正确方法是什么,并正确地工作在如果修改了的规范中--因为建议?
发布于 2016-12-02 14:39:12
您可以在比较之前将最后修改的日期millis设置为最大毫秒,这在技术上将抵消毫秒偏移。
public static Date setMaxMillis(Date day,Calendar cal) {
cal.setTime(day);
cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
return cal.getTime();
}
Query query = new Query(where("id").is(filter.getId()));
Criteria criteria = Criteria.where("lastModified").gt(setMaxMillis(filter.getLastModified(),Calendar.getInstance()));
query.addCriteria(criteria);
return mongoTemplate.findOne(query, MyDocument.class);https://stackoverflow.com/questions/40932850
复制相似问题