如何在一个地图功能中搜索和排序CouchDB

时间:2012-12-12 15:14:55

标签: couchdb

我对CouchDB知识有点磕磕绊绊。

我有一个内容数据库,该数据库标记有一系列标记并具有创建日期。

我想创建一个视图,其中包含标记有特定标记的有限数量的最新故事。

例如,最新的6个故事标记为“商业”。

跨越this question,这似乎让我几乎到了我需要去的地方,但我错过了一个关键元素,我认为在搜索时如何制作查询字符串以按一个键排序另一方。

这是我的地图功能。

function(doc) {
    if (doc.published == "yes" && doc.type == "news") {
        for (var i = 0; i < doc.tags.length; i++) {
            if (doc.tags[i]) {
                emit([doc.created, doc.tags[i]], doc);
            }
        }
    }
}

那么如何查询所有标记为“Business”的文档的视图,这些文档是基于创建的最新文档。

创建的属性是日期可排序格式。

2 个答案:

答案 0 :(得分:2)

首先,我会切换你的发射顺序:

emit([doc.tags[i], doc.created]);

(请忽略doc,您只需添加include_docs=true即可获取整个文档,并且您的视图在此过程中不会占用太多磁盘空间)< / em>的

现在,您可以使用以下查询字符串查询标记为"Business"的所有故事:

startkey=["Business"]&endkey=["Business",{}]

您将获得标记业务的所有文档,并且它们将按日期排序。

这利用了view collation,它基本上是管理索引排序/查询方式的规则。对于像这样的复杂键,对数组的每个项目分别进行排序。 (即,第一个键首先排序,第二个键排序第二,等等)这就是顺序重要的原因,因为在查询视图索引时必须始终从左向右移动。

如果您想要最近的6个,那么您的查询字符串将需要更改:

descending=true&limit=6&endkey=["Business"]&startkey=["Business",{}]

通知由于startkey参数的工作原理,您需要交换endkey / descending值。有关详细说明,请参阅View reference page on the wiki

答案 1 :(得分:0)

好吧,我想我想出来了,但我不确定我是否完全理解它。

我找到了this story关于复杂密钥以及搜索和排序的信息。

我的地图功能如下所示:

function(doc) {
    if (doc.published == "yes" && doc.type == "news") {
        for (var i = 0; i < doc.tags.length; i++) {
            if (doc.tags[i]) {
                emit([doc.tags[i], doc.created], doc);
            }
        }
    }
}

要使用它查询和排序,查询看起来像这样。

的http://本地主机:5984 /数据库/ _design /故事/ _view /标记限制= 10安培; startkey = [ “商务”]安培; endkey = [ “商业”,{}]&安培;降=假< / p>

我得到了我想要的结果,但我并不完全确定我理解这一切。