在Couchbase Server 3.0中,我的存储桶中的文档格式为:
{ "id":"xyz", "categories":["news", "articles", "etc.etc.."]}
我想编写一个视图,以便当我指定 key="news" 时,将返回在"类别"数组属性中包含"news"的所有文档。
我甚至编写了一个 map 函数,该函数发出同一篇文章的次数与"类别"数组中的元素一样多。
function (doc, meta) {
for(var i = 0; i < doc.categories.length ; i++)
emit(doc.categories[i], doc);
}
但我坚持减少。
事实证明map功能就足够了,我只需要在URL中使用key="cateogoryName"进行查询。
我最初感到困惑,因为如果您在查询中不将键括在引号中,则会出现一个非常神秘的错误,请参阅:https://issues.couchbase.com/browse/MB-7555
不确定reduce功能是否会更有效。
如果你只想查询数据,你不需要一个reduce函数,即你可以把它留空。只需 reduce 即可对结果集执行计算。
另请参阅:
http://docs.couchbase.com/developer/dev-guide-3.0/built-in-reduce.html
但是,您可以将地图更改为以下内容:
function (doc, meta) {
if (doc.categories) {
for(var i = 0; i < doc.categories.length ; i++) {
emit(doc.categories[i], null);
}
}
}
并可能检查 if 语句中的类型。您可以发出 null 作为第二个参数,因为没有减少函数。这可以在Java中查询,例如如下(异步):
bucket.async()
.query(query)
.flatMap(AsyncViewResult::rows)
.flatMap(AsyncViewRow::document)
...