根据couchbase中的标记从视图中过滤记录的最佳方法是什么?我的意思是我明白我可以从文档中提取标签,并使用视图中的地图功能将它们用作键。但有没有办法根据记录的键(可以是多个值)是否包含标记从视图中选择记录?
示例:我有一个具有以下标记的事务(标记1,标记2,标记3,标记4),每个视图记录(来自emit函数)看起来像这样
emit([tag1,tag2,tag3,tag4],null)
我想得到的是所有带有tag2的记录。
感谢您的帮助。
答案 0 :(得分:3)
两个建议......如果视图的唯一目的是查找具有特定标记的记录,则只需为每个标记发出一个视图行。
function (doc) {
if (doc.tags) {
for(var idx in doc.tags) {
emit(doc.tags[idx], null);
}
}
}
此map函数将为您提供如下行:
{"total_rows":13,"rows":[
{"id":"foo_doc_1","key":"a","value":null},
{"id":"foo_doc_3","key":"a","value":null},
{"id":"foo_doc_1","key":"b","value":null},
{"id":"foo_doc_2","key":"b","value":null},
{"id":"foo_doc_3","key":"b","value":null},
{"id":"foo_doc_1","key":"c","value":null},
{"id":"foo_doc_2","key":"c","value":null},
{"id":"foo_doc_1","key":"d","value":null},
{"id":"foo_doc_4","key":"d","value":null},
{"id":"foo_doc_4","key":"e","value":null}
]
}
按密钥查询时(例如,key =“a”),您将获得该密钥的结果。但是,如果你关注的是“给我所有文件,其中第二个标签是'xyz'”,那么你也可以发出索引。
function (doc) {
if (doc.tags) {
for(var idx in doc.tags) {
emit([parseInt(idx), doc.tags[idx]], null);
}
}
}
在此示例中,行类似:
{"total_rows":13,"rows":[
{"id":"foo_doc_1","key":[0,"a"],"value":null},
{"id":"foo_doc_3","key":[0,"a"],"value":null},
{"id":"foo_doc_2","key":[0,"b"],"value":null},
{"id":"foo_doc_4","key":[0,"d"],"value":null},
{"id":"foo_doc_1","key":[1,"b"],"value":null},
{"id":"foo_doc_3","key":[1,"b"],"value":null},
{"id":"foo_doc_2","key":[1,"c"],"value":null},
{"id":"foo_doc_4","key":[1,"e"],"value":null},
{"id":"foo_doc_1","key":[2,"c"],"value":null},
{"id":"foo_doc_4","key":[2,"f"],"value":null}
]
}
然后,您将使用数组键查询以获取特定位置的键(例如,key = [1,“b”])。