MongoDB文档中的ETag工具 - Java驱动程序

时间:2014-09-11 12:24:19

标签: mongodb

我的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可以将已缓存的资源返回给客户端,从而缩短响应时间。

谷歌搜索时,我有两个选择:

  1. hascode()as ETag:从MongoDB获取文档并填充Java 然后,计算用作ETag的hashCode()。但是我     想避免这种开销(完整doc read + hashcode计算)     https://devcenter.heroku.com/articles/jax-rs-http-caching

  2. 上次修改日期为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日期为毫秒。

  3. 请建议在MongoDB中提供ETag的标准方法。

1 个答案:

答案 0 :(得分:0)

我在将对象保存在MongoDB中之前进行哈希码计算,并将其存储在字段etag中。

收到请求后,我可以查找{"_id": REQUESTED_ID, "etag": {$ne: RECEIVED_ETAG}}

如果没有返回文档,您可能仍需要查明文档{"_id": REQUESTED_ID}是否存在(我这样做,但在您的情况下,WebCache可以处理此问题并返回404,否则为304)。

如果它确实返回了一个文档,只需使用其etag属性填写ETag标题,并可能将其从返回的正文中删除。