3

我对我的 CouchDB 知识有点困惑。

我有一个用标签数组标记的内容数据库,并且有一个创建日期。

我想创建一个视图,该视图可以提取有限数量的带有特定标签的最新故事。

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

遇到这个问题,这似乎让我几乎到达了我需要去的地方,但我缺少一个关键元素,我认为这是如何制作查询字符串以按一个键排序同时按另一个键进行搜索。

这是我的地图功能。

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);
            }
        }
    }
}

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

created 属性是日期可排序格式。

4

2 回答 2

2

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

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

(同样省略doc,您可以添加include_docs=true以获取整个文档,并且您的视图在此过程中不会占用太多磁盘空间)

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

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

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

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

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

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

注意由于参数的工作方式,您需要交换startkey/值。有关进一步说明,请参阅wiki 上的查看参考页面。endkeydescending

于 2012-12-12T15:33:59.683 回答
0

好的,我想我想通了,但我不太确定我是否完全理解它。

我发现了这个关于复杂键以及搜索和排序的故事。

我的地图功能如下所示:

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://localhost:5984/database/_design/story/_view/tagged?limit=10&startkey=["Business"]&endkey=["Business",{}]&descending=false

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

于 2012-12-12T15:53:42.513 回答