重新生成CouchDB视图

时间:2011-05-17 20:45:40

标签: nosql couchdb

受挫的例子:

{
  productName: 'Lost Series 67 DVD',
  availableFrom: '19/May/2011',
  availableTo: '19/Sep/2011'
}

查看storeFront / currentAvailableProducts基本上检查当前日期时间是否在availableFrom - availableTo内并发出文档。

我想强制视图每晚凌晨1点重新生成,即处理/映射所有文档。

起初我有一个简单的python脚本通过crontab调度触及每个文档因此导致新的修订和视图更新,但是因为couchdb只是附加,所以这不是非常有效 - 即加载了不必要的IO和磁盘空间使用通过压实,在各方面都非常浪费资源。

第二个解决方案是通过couchapp push再次推送视图定义,但这意味着视图在几分钟内不可用(或部分不可用),这也是不可接受的。

还有其他解决方案吗?

2 个答案:

答案 0 :(得分:6)

威尔的答案很棒;但只是为了得到这里所代表的共识观点:

保留一个视图,并每天以不同方式查询

确定您的时间片大小,例如一天。

接下来,对于每个文档,您为每个可用的时间片(日)发出一次。因此,如果文档从5月19日到5月21日(包括在内)可用,您的发射键将是:

"2011-05-19"
"2011-05-20"
"2011-05-21"

为每个文档计算一次后,要查找某一天可用的文档,只需查询该视图(例如今天)?key="2011-05-18"

您永远不必更新或重新运行您的观点。

如果由于某种原因绝不能更改查询URL,您可以使用_show函数将302(临时)重定向到今天的正确查询。

答案 1 :(得分:2)

所以你的视图没有自动更新我接受了吗?

新增和更改的文档没有动态添加?

哦,我明白了,你在作弊。您在视图创建期间使用“缺少文档”信息(即当前日期)。

没有视图重命名,但如果你绝望,你可以使用网址重写。

只需“每天”创建一个设计文档:/ db / _design / today05172011

然后使用一些网址重写来改变:GET / db / _design / today / _view / yourview

to:GET / db / _design / today051711 / _view / yourview

在服务器时间晚上11点创建视图(调整它以使“now”为“明天”或其他)。

然后添加一些清理代码以便以后删除旧视图。

这样您的视图就可以随心所欲地构建。

显然,您需要将Couch与其他一些Web服务器/代理连接起来,以便将其关闭。

它既优雅又不雅,同时也是。