2014-09-11 56 views
3

我的Java應用程序具有訪問MongoDB集合的REST GET apis(用JAX-RS實現)。 我試圖引入網頁緩存以減少響應時間(通過減少在MongoDB端讀取文檔)。MongoDB文檔中的ETag工具 - Java驅動程序

我在找標準的方式對資源提供ETag的http://en.wikipedia.org/wiki/HTTP_ETag)(資源從MongoDB中收集文件得到的),使的ETag MongoDB中收集將自動更新,每次更新文檔。

現在,我可以使用ETag在MongoDB文檔中的HTTP請求(「If-None-Match」)中驗證ETag,如果兩者相同,則返回304(未修改)。現在,WebCache可以將已經緩存的資源返回給客戶端,從而縮短響應時間。

在谷歌上搜索,我得到了以下兩個選擇:

  1. hascode()作爲ETag的:從MongoDB中獲得文件和填充的Java 對象,然後,計算出的hashCode(),它被用作ETag的。但我 想避免這種開銷(全DOC讀+哈希碼計算) https://devcenter.heroku.com/articles/jax-rs-http-caching

  2. 最後修改日期爲ETag的:添加新字段「上次修改時間」對MongoDB的 集合。 http://howtodoinjava.com/2013/06/05/jax-rs-resteasy-cache-control-with-etag-example/ 此機制更適合「上次修改」標題(HTTP 響應)。看起來,日期在這裏被誤用於ETag。在這裏我要 修改現有的文檔插入新字段(updatedTime)。同樣, HTML日期的精確度是sec,mongoDB日期是msec。

請建議標準方式在MongoDB中提供ETag。

回答

0

在將對象保存在MongoDB中之前,我正在做哈希碼計算,將其存儲在字段etag中。

當收到請求時,我可以查找{"_id": REQUESTED_ID, "etag": {$ne: RECEIVED_ETAG}}

如果沒有文檔返回,您可能仍然需要找出文檔{"_id": REQUESTED_ID}是否存在(我這樣做,但可能在您的情況下,WebCache可以處理這個並返回404,否則304)。

如果確實返回文檔,只需使用它的etag屬性填寫ETag標題,並可能將其從返回的主體中刪除。