0

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

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

发出 ([tag1,tag2,tag3,tag4], null)

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

谢谢你的帮助。

4

1 回答 1

3

两个建议...如果视图的唯一目的是查找具有特定标签的记录,您可以简单地为每个标签发出一个视图行。

function (doc) {
  if (doc.tags) {
    for(var idx in doc.tags) {
      emit(doc.tags[idx], null);
    }
  }
}

此地图功能将为您提供如下行:

{"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"])。

于 2012-07-03T16:59:01.690 回答