我对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”的文档的视图,这些文档是基于创建的最新文档。
创建的属性是日期可排序格式。
答案 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>
我得到了我想要的结果,但我并不完全确定我理解这一切。