2011-04-06 54 views
5

目前我正在试图创建一个视图和查询,以适应这个SQL查询:多个键值的CouchDB视图的查询

SELECT * FROM articles 
WHERE articles.location="NY" OR articles.location="CA" 
ORDER BY articles.release_date DESC 

我试图创建一个复杂的关键视图:

function(doc) { 
    if(doc.type == "Article") { 
    emit([doc.location, doc.release_date], doc) 
    } 
} 

然后使用startkeyendkey检索一个位置并在发布日期对结果进行排序。

.../_view/articles?startkey=["NY", {}]&endkey=["NY"]&limit=5&descending=true 

这工作正常。

但是,我怎么能发送多个startkeys和endkeys我的看法,以模仿

WHERE articles.location="NY" OR articles.location="CA"

+0

虽然答案是正确的,它看起来像这仍然是不可能的,看来这将是随时可用2.0出来:https://issues.apache.org/jira/browse/ COUCHDB-523 – 2015-05-14 15:06:50

回答

7

我的拱门克星,多米尼克,是对的。

此外,它是永远不可能按标准A查询,然后按CouchDB中的标准B排序。为了换取这种不便,CouchDB保证可扩展的,可靠的对数查询时间。你有一个选择。

  • 店铺在其自己的数据库视图输出,并且使新的视图通过标准乙排序
  • ,行之后进行排序,它可以是
    • 排序客户机一旦收到行
    • 排序服务器端,在_list功能。这很好,但请记住它不是最终可扩展的。如果您有数百万行,则_list函数可能会崩溃。
+5

Arch nemesis ?? :O – 2011-04-07 13:27:03

+0

我打算至少有50000个文档,所以在客户端进行排序是不可能的:)并且_list函数不会缩放...所以剩下的只有2个选项是将视图输出存储在其中自己的数据库,并创建一个新的视图,或使用Lucene搜索引擎?如何解决这个问题?假设我有50个地点,我不想打50个电话到我的视图,然后遍历结果以获得10个最近的文章。 – ephemere 2011-04-07 15:32:08

+0

@ephemere,我知道临时数据库并不理想。然而,一旦你已经得到了它,你可以用它来处理类似的情况,按A选择,按B排序。你只需要读取_view'行并将它们变成'_bulk_docs'行。 – JasonSmith 2011-04-07 17:23:08

4

简短的回答是,您目前不能使用使用多个startkey/endkey组合。

您将不得不做2个单独的查询,或者您可以随时在lucene搜索引擎上添加以获得更强大的搜索功能。

可能在查询中使用多个key参数。请参阅Couchbase CouchDB documentation on multi-document fetching

+0

+1。我冒昧地在同一时间链接到多个'key'查询的文档(种类,但不是OR查询)。 – JasonSmith 2011-04-07 04:49:31

+0

此解决方案的问题是我不想指定日期。比方说,我需要纽约或CA最近的10篇文章,我怎么用密钥写这篇文章? {“NY”,{}],[“CA”,{}]] } – ephemere 2011-04-07 15:24:35

+0

多文档抓取的页面是404.您可能需要:http://www.couchbase的.com /文档/ couchbase单服务器-1-2/couchbase-API-design_db设计-designdoc - 视图 - viewname_post-的multidoc。html – Cheeso 2012-06-28 17:11:43