我有一个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)
此时我还有几个问题:
一些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()进行类似的操作?
我没有在golang客户端API示例或文档中找到这些问题。我可能错过了什么。如果有人有链接,请告诉我。
感谢您的帮助!
答案 0 :(得分:1)
如果您使用的是github.com/couchbaselabs/go-couchbase
,则可以使用bucket.ViewCustom
来解决问题。它接受一个查看结果的项目。
bucket.View
只是使用预定义的结构调用bucket.ViewCustom
并返回它。
执行的视图结果是如下所示的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具有桶没有的功能。查看结果按键排序,因此您可以指定结果开始位置的startkey
选项。您可以使用此属性并创建搜索视图。有关详细信息,请参阅Querying views。
但是您需要更详细的搜索,例如全文搜索,您应该使用ElasticSearch plugin或N1QL
来执行此操作。
(注意N1QL
是预览版,尚未正式发布)