我的 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/