Cloudant 是否支持将重写作为函数?

Does Cloudant support rewrites as functions?

我有一个 Cloudant 数据库,我想为我的包含斜杠的文档制作漂亮的 URL。所以我定义了一个重写函数,如下所示:

1
2
3
4
5
6
{
 "_id":"_design/myRewrites",
 "rewrites":"function (req2) {\
    return {path: "../../../" + req2.path.slice(4).join("%2F")};\
}"
}

重写函数格式更好:

1
2
3
function (req2) {
  return {path:"../../../" + req2.path.slice(4).join("%2F")};
}

根据 CouchDB 文档,自 CouchDB 1.7 起,CouchDB 就支持这种重写(作为字符串化函数),但 Cloudant 的文档没有提及这种特殊功能(仅从数组重写)。

这反映在我尝试 https://myAccount.cloudant.com/myDb/_design/myRewrites/_rewrite/hello/world/ 时的体验中,我得到以下响应:

1
{"error":"unknown_command","reason":"unknown ddoc command 'rewrites'"}

但是,我在某处读到 Cloudant 和 CouchDB 自 2.0 以来的源代码匹配,因此我希望 Cloudant 支持所有 CouchDB 功能。怎么回事?

另请参阅以下关于此的推文,其中 IBM 要求我在 StackOverflow 上提出问题并建议我可能在一个过时的集群上:https://twitter.com/digitalheir/status/845910843934085120

我的数据位置显示"Porter, London"。如果我改变它会有帮助吗?


tl;dr:抱歉,没有。 Cloudant 不支持重写为函数 :(

我们尝试了您的示例并得到了相同的结果。深入挖掘,我现在可以确认 Cloudant 不支持通过字符串化函数重写 URL。该服务仅支持使用数组方法进行重写。

我不能肯定地说,但我怀疑团队忽略了这个功能。也就是说,Cloudant 不太可能很快支持重写为 JS 函数,因为当前的方法不能很好地扩展,因为如果频繁更新视图,它可能会使数据库陷入困境。这与 Cloudant 建议人们使用内置 reduce 函数(在 Erlang 中实现)而不是编写自己的自定义 JavaScript reduce 的原因类似。

重写为数组,但是,确实可以扩展。但如果您动态生成 URL,这种方法显然行不通。在这种情况下,我们建议将 URL 重写功能移至应用服务器。不幸的是,如果你正在构建一个 CouchApp :/

这很令人困惑,所以感谢您指出这一点。我将要求 Cloudant 团队在文档中注意这一差异。希望这至少有助于提供一些关闭。您期望它起作用并没有错。