你如何访问 couchbase 视图中的值?
how do you access the values in a couchbase view?
我有一个 widget.json 文件已加载到 couchbase 中的文档中:
{
"type": "widget",
"name": "clicker",
"description": "clicks!"
}
我还有一个沙发底座设计文档,couchbase.ddoc,用于一个水桶。它以名称 "views":
注册
{
"_id": "_design/accesscheck",
"language": "javascript",
"views": {
"all_widgets": {
"map": "function(doc, meta) { if(doc.type == 'widget') { emit(meta.id, doc.name); } }"
}
}
}
和一些 golang 代码,使用 couchbase golang API 来获取它:
opts := map[string]interface{}{
"stale": false
}
data, _ := bucket.View("views", "all_widgets", opts)
此时我还有几个问题:
- 确定我可以使用 "data" 变量做什么的最佳方法是什么?我怀疑这是一个整数索引行列表,每个行都包含一个 key/value 映射,其中值可以是不同类型。我看到很多关于 map[string]interface{} 的简单示例,但这似乎有一个额外的间接级别。用 C 语言很容易理解,恕我直言,但界面{}{}让我感到困惑。
- 可能是上述答案的扩展,但如何使用设计文档进行有效搜索?我宁愿让 Couchbase 服务器进行筛选。
一些 Get() 示例传入结构类型,即
type User struct {
Name string `json:"name"`
Id string `json:"id"`
}
err = bucket.Get("1", &user)
if err != nil {
log.Fatalf("Failed to get data from the cluster (%s)\n", err)
}
fmt.Printf("Got back a user with a name of (%s) and id (%s)\n", user.Name, user.Id)
是否可以用 View() 做这样的事情?
- 有人知道将视图机制灵活地挂接到 net/http REST 处理程序的好方法吗?只是希望..
我没有在 golang 客户端 API 示例或文档中找到这些问题。我可能错过了什么。如果有人有链接请告诉我。
感谢您的帮助!
在 Go 中自定义查看结果
如果您正在使用github.com/couchbaselabs/go-couchbase
,您可以使用bucket.ViewCustom
来解决您的问题。它接受将视图结果解析为的项目。
bucket.View
只是用预定义结构调用 bucket.ViewCustom
并且 returns 它。
执行的视图结果是一个如下所示的 json 对象;
{
"total_rows": 123,
"rows": [
{
"id": "id of document",
"key": {key you emitted},
"value": {value you emitted},
"doc": {the document}
},
...
]
}
由于我们知道这个结构,我们可以手动将结构类型设置为bucket.ViewCustom
。
在您的情况下,您可以像这样为 "all_widgets" 编写自定义视图结构;
type AllWidgetsView struct {
Total int `json:"total_rows"`
Rows []struct {
ID string `json:"id"` // document id
Key string `json:"string"` // key you emitted, the 'meta.id'
Value string `json:"value"` // value you emitted, the 'doc.name'
} `json:"rows"`
}
并使用 bucket.ViewCustom
检索值。
var result AllWidgetsView
opts := map[string]interface{}{}
viewErr := bucket.ViewCustom("views", "all_widgets", opts, &result)
if viewErr != nil {
// handle error
}
如果这种代码模式经常出现,你可以重构它。
高效搜索
问题2与golang无关,是Couchbase本身
View 有一些 bucket 没有的功能。查看结果按键排序,因此您可以指定 startkey
选项作为结果的开始位置。您可以使用此属性并制作视图以进行搜索。有关详细信息,请参阅 Querying views。
但是您需要更详细的搜索,例如全文搜索,您应该使用 ElasticSearch plugin or N1QL
来完成。
(注意 N1QL
是预览版,尚未正式发布)
我有一个 widget.json 文件已加载到 couchbase 中的文档中:
{
"type": "widget",
"name": "clicker",
"description": "clicks!"
}
我还有一个沙发底座设计文档,couchbase.ddoc,用于一个水桶。它以名称 "views":
注册{
"_id": "_design/accesscheck",
"language": "javascript",
"views": {
"all_widgets": {
"map": "function(doc, meta) { if(doc.type == 'widget') { emit(meta.id, doc.name); } }"
}
}
}
和一些 golang 代码,使用 couchbase golang API 来获取它:
opts := map[string]interface{}{
"stale": false
}
data, _ := bucket.View("views", "all_widgets", opts)
此时我还有几个问题:
- 确定我可以使用 "data" 变量做什么的最佳方法是什么?我怀疑这是一个整数索引行列表,每个行都包含一个 key/value 映射,其中值可以是不同类型。我看到很多关于 map[string]interface{} 的简单示例,但这似乎有一个额外的间接级别。用 C 语言很容易理解,恕我直言,但界面{}{}让我感到困惑。
- 可能是上述答案的扩展,但如何使用设计文档进行有效搜索?我宁愿让 Couchbase 服务器进行筛选。
一些 Get() 示例传入结构类型,即
type User struct { Name string `json:"name"` Id string `json:"id"` } err = bucket.Get("1", &user) if err != nil { log.Fatalf("Failed to get data from the cluster (%s)\n", err) } fmt.Printf("Got back a user with a name of (%s) and id (%s)\n", user.Name, user.Id)
是否可以用 View() 做这样的事情?
- 有人知道将视图机制灵活地挂接到 net/http REST 处理程序的好方法吗?只是希望..
我没有在 golang 客户端 API 示例或文档中找到这些问题。我可能错过了什么。如果有人有链接请告诉我。
感谢您的帮助!
在 Go 中自定义查看结果
如果您正在使用github.com/couchbaselabs/go-couchbase
,您可以使用bucket.ViewCustom
来解决您的问题。它接受将视图结果解析为的项目。
bucket.View
只是用预定义结构调用 bucket.ViewCustom
并且 returns 它。
执行的视图结果是一个如下所示的 json 对象;
{
"total_rows": 123,
"rows": [
{
"id": "id of document",
"key": {key you emitted},
"value": {value you emitted},
"doc": {the document}
},
...
]
}
由于我们知道这个结构,我们可以手动将结构类型设置为bucket.ViewCustom
。
在您的情况下,您可以像这样为 "all_widgets" 编写自定义视图结构;
type AllWidgetsView struct {
Total int `json:"total_rows"`
Rows []struct {
ID string `json:"id"` // document id
Key string `json:"string"` // key you emitted, the 'meta.id'
Value string `json:"value"` // value you emitted, the 'doc.name'
} `json:"rows"`
}
并使用 bucket.ViewCustom
检索值。
var result AllWidgetsView
opts := map[string]interface{}{}
viewErr := bucket.ViewCustom("views", "all_widgets", opts, &result)
if viewErr != nil {
// handle error
}
如果这种代码模式经常出现,你可以重构它。
高效搜索
问题2与golang无关,是Couchbase本身
View 有一些 bucket 没有的功能。查看结果按键排序,因此您可以指定 startkey
选项作为结果的开始位置。您可以使用此属性并制作视图以进行搜索。有关详细信息,请参阅 Querying views。
但是您需要更详细的搜索,例如全文搜索,您应该使用 ElasticSearch plugin or N1QL
来完成。
(注意 N1QL
是预览版,尚未正式发布)