我的Java应用程序具有访问MongoDB集合的REST GET apis(使用JAX-RS实现)。 我正在尝试引入Web缓存以减少响应时间(通过减少MongoDB端的文档读取)。
我正在寻找标准方法来为资源提供 ETag (http://en.wikipedia.org/wiki/HTTP_ETag)(资源来自MongoDB集合中的文档),以便MongoDB集合中的 ETag < / strong>会在每次更新文档时自动更新。
现在,我可以在MongoDB文档中使用ETag验证HTTP请求中的ETag(“If-None-Match”),如果两者相同则返回304(未修改)。现在,WebCache可以将已缓存的资源返回给客户端,从而缩短响应时间。
谷歌搜索时,我有两个选择:
hascode()as ETag:从MongoDB获取文档并填充Java 然后,计算用作ETag的hashCode()。但是我 想避免这种开销(完整doc read + hashcode计算) https://devcenter.heroku.com/articles/jax-rs-http-caching
上次修改日期为ETag:将新字段“Last modified”添加到mongoDB 采集。 http://howtodoinjava.com/2013/06/05/jax-rs-resteasy-cache-control-with-etag-example/ 此机制更适合“Last Modified”标头(HTTP 响应)。看起来,日期在这里被滥用于ETag。我要来 修改现有doc以插入新字段(updatedTime)。再次, HTML日期的精度为秒,mongoDB日期为毫秒。
请建议在MongoDB中提供ETag的标准方法。
答案 0 :(得分:0)
我在将对象保存在MongoDB中之前进行哈希码计算,并将其存储在字段etag
中。
收到请求后,我可以查找{"_id": REQUESTED_ID, "etag": {$ne: RECEIVED_ETAG}}
。
如果没有返回文档,您可能仍需要查明文档{"_id": REQUESTED_ID}
是否存在(我这样做,但在您的情况下,WebCache可以处理此问题并返回404,否则为304)。
如果它确实返回了一个文档,只需使用其etag
属性填写ETag
标题,并可能将其从返回的正文中删除。