如何在CouchDB中创建Erlang视图
我之前也碰到过几乎一模一样的困扰——服务器上跑了太多couchjs进程,想转Erlang视图优化性能,但找了半天不知道怎么正确部署。结合自己的踩坑经验,把解决过程整理出来:
问题场景回顾
服务器上多couchjs进程占用资源,计划将CouchDB视图迁移为Erlang版本,但遇到这些障碍:
- 找不到输入Erlang视图代码并保存的操作入口/对应HTTP API
- 旧文档提到的临时视图功能在CouchDB 2.1中已被移除
- 启用
native-erlang-query-server后,修改视图语言报错,仅调整content-type为multipart/form-data无效
最终解决步骤
后来参考Juanjo Rodriguez的建议,用PUT方法直接操作设计文档才搞定,具体步骤如下:
确认Erlang查询服务已启用
先检查CouchDB配置(比如local.ini)的[query_servers]段,确保已经添加Erlang查询服务的配置:erlang = {couch_native_process, start_link, []}配置完成后重启CouchDB,确保服务生效。
用PUT请求创建/更新Erlang视图
因为临时视图(_temp_view)在2.1+版本已被移除,必须通过设计文档来部署Erlang视图。直接发送PUT请求到设计文档端点,提交包含Erlang视图函数的JSON即可,无需依赖multipart/form-data。举个实际的HTTP请求示例:
PUT /your_db_name/_design/your_design_doc HTTP/1.1 Content-Type: application/json { "_id": "_design/your_design_doc", "views": { "sample_view": { "map": "fun({Doc}) -> emit(maps:get(<<\"user_id\">>, Doc), maps:get(<<\"username\">>, Doc)) end.", "reduce": "fun(Keys, Values, ReReduce) -> length(Values) end." } }, "language": "erlang" }注意:Erlang函数要写成字符串形式,内部的双引号需要转义;同时必须指定
"language": "erlang",否则CouchDB会默认用JavaScript解析,直接报错。验证视图可用性
发送GET请求访问视图地址:/your_db_name/_design/your_design_doc/_view/sample_view,如果能正常返回视图结果,说明Erlang视图已经部署成功,服务器上的couchjs进程也会相应减少。
额外注意事项
- 千万别再尝试用旧的
_temp_view接口,CouchDB 2.1及以后版本彻底移除了这个功能 - Erlang视图的函数语法要严格遵循Erlang规范,比如map函数接收的是文档元组
({Doc}),Doc在CouchDB 2.x中是map类型,需要用maps:get/2来取值
内容的提问来源于stack exchange,提问作者Rafael P. Miranda

