- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我使用 spring 数据在我的 MongoDB 上插入文档时,我执行以下操作:
Update update = new Update();
update.currentDate("lastModified");
mongoTemplate.upsert(query, update, MyDocument.class);
我正在使用 MongoDB 的 currentDate,因为我想用我的 MongoDB 数据库所在的日期保存 MyDocument 的最后修改日期。
基于spec :
The If-Modified-Since request-header field is used with a method to make it conditional: if the requested variant has not been modified since the time specified in this field, an entity will not be returned from the server; instead, a 304 (not modified) response will be returned without any message-body.
因此,保存此日期的目的是根据收到的日期验证 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);
除了一个问题外,这工作得很好:规范说标题 if-modified-since 具有以下格式:
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
这意味着毫秒数不会在 if-modified-since header 上传递。但是,MongoDB IsoDate 以毫秒为单位保存当前日期。因此,当两个日期完全相同时,查询将不会返回 304 Not Modified,但会返回整个资源,因为查询将如下所示:
{ "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 毫秒。
最后一个问题是:解决这个问题的正确方法是什么,并且按照 if-modified-since 的规范正确工作?
最佳答案
您可以将最后修改日期毫秒设置为比较前的最大毫秒数这在技术上会抵消毫秒偏移量。
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);
关于java - Mongodb IsoDate 和微服务上 if-modified-since 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40932850/
我的应用程序生成 JSON 格式的日志。日志看起来像这样: {"LogLevel":"error","Datetime":"2013-06-21T11:20:17Z","Module":"DB","M
我正在编写一个 RScript 来将当前系统时间戳与 MongoDB 最后更新的时间戳进行比较。我的做法: db.runs.find().sort({'id':-1}).limit(1) - 给出最后
如何将字符串 "2015-02-02" 转换为 ISODate 2015-02-02T00:00:00.000Z?我试图找到一些例子,但没有找到。 最佳答案 您可以为此使用常规的 Javascript
我试图将正则表达式过滤器(年)应用于日期类型字段,但查询未返回任何结果。那么是不是试图了解此查询的行为? db.collection.find({"ReportedDate":/2016/i}) 注意
我正在执行测试以确保我正确获取日期。 我当前的测试是:选择 mongodb ISODate 格式的日期并将其转换为数值(自 1970 年以来的毫秒数),反之亦然 示例: var date_test =
我正在使用 MongoCursor 迭代集合并检索changeDate(ISODate 格式)。但是,使用 mongocursor 会以不同的格式返回数据。是否可以检索 ISODate 格式的chan
是否可以计算文档中两个日期之间的差异服务器端,并对其进行查询? (如SQL的DATEDIFF函数) 假设我有很多这样的文档: >>> db.collection.find() [ { "id"
我需要返回集合中每个用户的最小 client_timestamp 值,但是我无法让 $min 运算符以这种方式运行。有没有办法让查询返回集合中所有 user_ids 的最小 client_timest
我正在寻找来自 qt 的日期时间,以将字符串作为 isodate 但带有时区返回给我。我有时会在网上查看我的问题,但没有找到解决方案 我刚刚得到这个: this->ui.dateEnd->dateTi
为什么最后两个语句返回false? test:PRIMARY> a = new ISODate(); b = a; ISODate("2014-08-21T19:48:12.963Z") test:P
问题在 MongoDB 中将字符串解析为日期时,推荐的实现是什么? 我问这个是因为我们有供应商以“2017-01-01”和“2017/01/01”的格式向我们发送日期的字符串表示形式。我原以为使用 D
在集合中,我存储了这种文档: { "_id" : ObjectId("55e8a5cba21b9e051eb448d1"), "created_at" : "2015-01-01T00
我正在尝试使用 nodejs/mongoose 从 mongodb 获取结果。 var dateStr = new Date(year,month,day,0,0,0); var nextDate =
我正在尝试按小时聚合 MongoDB 集合中的记录,并且需要将存储为时间戳(毫秒)的日期转换为 ISODate,以便我可以使用聚合框架的内置日期运算符($hour、$month 等) 记录存储为 {
我正在尝试运行这个: mongoexport.exe -h *MYHOST* -p *MYPORT* -q "{'time':{'$gte': ISODate('2014-12-21 12:57:00
我似乎无法在 MongoDB 中使用最基本的日期查询。文档看起来像这样: { "_id" : "foobar/201310", "ap" : "foobar", "dt" :
我无法在 python 中导入 rdflib。错误详细信息: Python 2.7.3 (default, Jun 27 2012, 23:48:21) [GCC 4.6.1] on linux2 T
有谁知道一种更简洁的方法来将时区包含在 QDateTime 的 ISO 字符串表示中? 我应该可以使用以下内容: qDebug() #include int main(int argc, int
我有一个适用于 mongodb shell 的简单查询: db.collection.find({"date": {$lt: ISODate("2015-11-03T00:00:00Z")} }) 非
我从 ISODate 对象的 MongoDb 接口(interface)中丢失了纳秒。当我在 perl 中读取它们时,所有纳秒都设置为零。 首先是我的环境: MongoDB version: 1.8.
我是一名优秀的程序员,十分优秀!