MongoDB 文档中的 ETag 工具 - Java 驱动程序
Posted
技术标签:
【中文标题】MongoDB 文档中的 ETag 工具 - Java 驱动程序【英文标题】:ETag facility in MongoDB document - Java driver 【发布时间】:2014-11-05 09:34:01 【问题描述】:我的 Java 应用程序具有访问 MongoDB 集合的 REST GET api(使用 JAX-RS 实现)。 我正在尝试引入网络缓存以减少响应时间(通过减少 MongoDB 端的文档读取)。
我正在寻找为资源提供 ETag (http://en.wikipedia.org/wiki/HTTP_ETag) 的标准方式(资源来自 MongoDB 集合中的文档),以便 MongoDB 集合中的 ETag 每次更新文档时都会自动更新。
现在,我可以使用 MongoDB 文档中的 ETag 验证 HTTP 请求(“If-None-Match”)中的 ETag,如果两者相同,则返回 304(未修改)。现在,WebCache 可以将已经缓存的资源返回给客户端,从而提高响应时间。
在谷歌搜索时,我得到了以下 2 个选项:
hascode() as ETag:从 MongoDB 获取文档并填充 Java 对象,然后,计算用作 ETag 的 hashCode()。但是我 想要避免这种开销(完整的文档读取 + 哈希码计算) https://devcenter.heroku.com/articles/jax-rs-http-caching
上次修改日期为 ETag:将新字段“上次修改”添加到 mongoDB 收藏。 http://howtodoinjava.com/2013/06/05/jax-rs-resteasy-cache-control-with-etag-example/ 这种机制更适合“Last Modified”标头(HTTP 回复)。看起来,ETag 在这里误用了日期。在这里我必须 修改现有文档以插入新字段 (updatedTime)。再次, html 日期精度为 sec,mongoDB 日期精度为 msec。
请建议在 MongoDB 中提供 ETag 的标准方式。
【问题讨论】:
【参考方案1】:我在将对象持久化到 MongoDB 之前进行哈希码计算,将其存储在字段 etag
中。
收到请求时,我可以查找"_id": REQUESTED_ID, "etag": $ne: RECEIVED_ETAG
。
如果没有返回文档,您可能仍需要确定文档 "_id": REQUESTED_ID
是否存在(我确实存在,但也许在您的情况下 WebCache 可以处理并返回 404,否则返回 304)。
如果它确实返回了一个文档,只需使用其etag
属性填充ETag
标头,并可能将其从返回的正文中删除。
【讨论】:
如何缓存查询?一个查询可以返回多个文档。以上是关于MongoDB 文档中的 ETag 工具 - Java 驱动程序的主要内容,如果未能解决你的问题,请参考以下文章