3

在对记录排名的想法进行了多次角力之后,我最终确定了我的文档的基于数字的分数,我发出这些分数以根据这些分数对它们进行排序。

现在这些数字有意义,其中前 2 位数字代表特定类型的文档。

因此,要根据分数对类型 22 的文档进行排序,我只需查询开始键为 220000 且结束键为 229999 的视图

这一切都很好并且有效,当我尝试使用 url 重写时会出现我的问题。

我基本上是在尝试重新路由:

/_rewrite/rankings/{doctype}

/_list/rankings?startkey=xx0000&endkeyxx9999

其中 xx 是 {doctype}

我的问题是指定重写规则:

[
    { "from":"rankings/:doctype",
      "to":"_list/rankings",
      "query": ??? //what will this be?
]
  • 如何通过分别附加 0000 和 9999 来构造开始键和结束键?

  • 如何指定数值?因为使用占位符 ":doctype" 将导致字符串类型而不是数字类型,即使我要修改漂亮的 url 以输入开始键和结束键,也会导致查询失败。

  • 我通过在我的列表视图中过滤结果来解决这个问题(忽略我对 getRow() 不感兴趣的文档),我在这里关心的是,我现在应该担心列表函数的效率吗?

也可以随意评论我的排序策略.. 有兴趣知道其他人如何使用 couchdb 解决排序和切片问题

4

1 回答 1

1

解决方案

首先,您应该在数组中分别发出类型分数,而不是将它们连接起来:

emit([doc.type, doc.score], doc);

然后你可以像这样重写

[
  {
    "from"  : "rankings/:doctype",
    "to"    : "_list/rankings/rankings",
    "query" : {
      "startkey" : [":doctype", 0],
      "endkey"   : [":doctype", 9999]
    },
    "formats": {
      "doctype" : "int"
    }
  }
]

我在 CouchDB 1.1.1 上对其进行了测试,它可以工作。

参考

相关文档埋在JIRA上的这个问题中:COUCHDB-1074

如您所见,该问题已在 2011 年 4 月得到解决,因此它应该可以在 CouchDB 1.0.3 及更高版本中运行。

于 2012-01-11T06:01:43.667 回答