如何在一个映射函数中使用CouchDB进行搜索和排序

如何在一个映射函数中使用CouchDB进行搜索和排序,couchdb,Couchdb,我的CouchDB知识有点结巴 我有一个内容数据库,它用一系列标记进行标记,并有一个创建日期 我想创建一个视图,该视图可以提取有限数量的带有特定标记的最新故事 例如,最新的6个故事标记为“业务” 遇到了,这似乎让我几乎到达了我需要去的地方,但我缺少了一个关键元素,我认为这就是如何在按一个键进行搜索的同时手工创建查询字符串 这是我的地图功能 function(doc) { if (doc.published == "yes" && doc.type == "news") {

我的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);
            }
        }
    }
}
功能(doc){
如果(doc.published==“yes”&&doc.type==“news”){
对于(变量i=0;i
那么,如何查询标记为“Business”的所有文档的视图,这些文档是基于创建的最新文档


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

首先,我要切换您的发送顺序:

emit([doc.tags[i], doc.created]);
(也可以省略
doc
,您只需添加
include\u docs=true
即可获得整个文档,并且您的视图在此过程中不会占用太多磁盘空间)

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

startkey=["Business"]&endkey=["Business",{}]
您将获得标签业务的所有文档,并按日期进行排序

这利用了,这基本上是控制索引如何排序/查询的规则。对于这样的复杂键,将分别对数组的每个项进行排序。(即,第一个键排序第一,第二个键排序第二,等等)这就是为什么顺序很重要,因为查询视图索引时必须始终从左向右移动

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

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

注意由于
降序
参数的工作方式,您需要交换
开始键
/
结束键
值。请参阅进一步的解释。

好的,我想我已经明白了这一点,但我不太确定我是否完全理解它

我找到了关于复杂键和搜索排序的信息

我的映射函数如下所示:

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);
            }
        }
    }
}
功能(doc){
如果(doc.published==“yes”&&doc.type==“news”){
对于(变量i=0;i
要使用它进行查询和排序,查询如下所示

http://localhost:5984/database/_design/story/_view/tagged?limit=10&startkey=[“业务”]&endkey=[“业务”,{}]&descending=false


我得到了我想要的结果,但我不能完全确定我是否完全理解。

我将对我的答案进行更多解释