你如何访问 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)

此时我还有几个问题:

  1. 确定我可以使用 "data" 变量做什么的最佳方法是什么?我怀疑这是一个整数索引行列表,每个行都包含一个 key/value 映射,其中值可以是不同类型。我看到很多关于 map[string]interface{} 的简单示例,但这似乎有一个额外的间接级别。用 C 语言很容易理解,恕我直言,但界面{}{}让我感到困惑。
  2. 可能是上述答案的扩展,但如何使用设计文档进行有效搜索?我宁愿让 Couchbase 服务器进行筛选。
  3. 一些 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() 做这样的事情?

  1. 有人知道将视图机制灵活地挂接到 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 是预览版,尚未正式发布)