在couchbase中对视图数据执行过滤的最佳方法

时间:2012-06-28 19:54:37

标签: couchbase

根据couchbase中的标记从视图中过滤记录的最佳方法是什么?我的意思是我明白我可以从文档中提取标签,并使用视图中的地图功能将它们用作键。但有没有办法根据记录的键(可以是多个值)是否包含标记从视图中选择记录?

示例:我有一个具有以下标记的事务(标记1,标记2,标记3,标记4),每个视图记录(来自emit函数)看起来像这样

emit([tag1,tag2,tag3,tag4],null)

我想得到的是所有带有tag2的记录。

感谢您的帮助。

1 个答案:

答案 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”])。