我正在尝试编写一个 couchdb 视图,该视图采用可排序格式的 created_at 时间戳(2009/05/07 21:40:17 +0000)并返回所有具有更大 created_at 值的文档。
我专门使用 couch_foo 但如果我能弄清楚如何编写视图,我可以在蒲团或 couch_foo 模型中创建它,而不是让 couch_foo 为我做。
如果可能的话,我已经四处搜索,无法弄清楚地图/减少来做到这一点。
在我完全理解视图的工作原理之前,我最初遇到了这种问题。
理解的关键是视图仅针对文档的每个(修订)运行一次。换句话说,当您查询视图时,您不会运行该函数,您只需查找该函数运行时的结果。因此,无法将任何用户提交的参数传递到视图中。
那么如何将视图中的值与用户提交的值进行比较呢?秘诀是将该字段作为 map 函数中的键发出,并依靠让 couchdb 按键排序。
您的地图功能将类似于
"map" : "function(doc) { emit(doc.created_at, doc); }"
你会像这样查询它:
http://localhost:5984/db/_design/ddoc/_view/view?startkey=%222009/05/07%2021:40:17 +0000%22
我冒昧地对 url 中的引号和空格进行了 uriEncoding,以便它可以按原样使用。
您想编写一个视图,以该格式创建时间戳字段的键,然后使用startkey
参数对其进行查询。
所以视图看起来像:
"map" : "function(doc) { emit(doc.timestamp_field, doc) }"
您的网址将类似于:
http://mysever/database/_design/mydoc/_view/myview?startkey="2009/05/07 21:40:17 +0000"
Wiki上的HTTP 视图 API页面有更多信息。您也可以考虑用户邮件列表。
请注意,couchdb 仅适用于 json 值。如果存储在 couchdb 中的文档的时区与您的 startkey 的时区不同,则查询可能会失败。