couchdb - 如何在一个 map 功能中使用 CouchDB 进行搜索和排序

标签 couchdb

我的 CouchDB 知识有点绊脚石。

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

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

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

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

这是我的 map 功能。

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

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

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

最佳答案

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

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

(也省略doc,您只需添加include_docs=true即可获取整个文档,并且您的 View 不会占用太多空间进程中的磁盘空间)

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

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

您将获得带有“business”标签的所有文档,并且它们将按日期排序。

这利用了 view collation ,这基本上是管理索引如何排序/查询的规则。对于像这样的复杂键,数组中的每一项都会单独进行排序。 (即,第一个键首先排序,第二个键其次排序,等等)这就是顺序很重要的原因,因为在查询 View 索引时必须始终从左向右移动。

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

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

注意由于descending参数的工作原理,您需要交换startkey/endkey值。请参阅View reference page on the wiki以获得进一步的解释。

关于couchdb - 如何在一个 map 功能中使用 CouchDB 进行搜索和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842766/

相关文章:

typescript - NestJS 中的 CouchDB

ubuntu - Ubuntu 14.04 中的 Couchdb 'init terminating in do_boot' 错误

view - 需要一个 CouchDB 技巧来按日期排序并按组过滤

python - CouchDB 和 Python : how to use "_show" and "_list" functions?

android - 应用程序和服务器之间 SQLite 数据库的一对一同步

javascript - 来自 javascript 的 http GET 和 PUT 二进制数据(CouchDB 附件)

CouchDB View 返回带有复杂键的空行以进行日期数组比较

node.js - 如何从 Node.js 在 MongoDB 和 CouchDB 中存储富文本数据

ssl - Raspbian 上的 CouchDB 1.6.1 SSL 错误

node.js - 如何使用PouchDB(leveldb)将我的 Electron 应用程序与Cloudant或其他任何支持CouchDB并同步的数据库进行连接