【问题标题】:how do you access the values in a couchbase view?您如何访问 couchbase 视图中的值?
【发布时间】:2015-04-28 11:57:26
【问题描述】:

我有一个 widget.json 文件,它被加载到 couchbase 中的文档中:

{
  "type": "widget",
  "name": "clicker",
  "description": "clicks!"
}

我还有一个用于存储桶的 couchbase 设计文档 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. 确定我可以使用“数据”变量做什么的最佳方法是什么?我怀疑这是一个整数索引行的列表,每个行都包含一个键/值映射,其中值可以是不同的类型。我看到很多关于 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. 有人知道灵活地将 View 机制连接到 net/http REST 处理程序的好方法吗?只是希望..

我没有在 golang 客户端 API 示例或文档中找到这些问题。我可能错过了什么。如果有人有链接,请告诉我。

感谢您的帮助!

【问题讨论】:

    标签: view go couchbase


    【解决方案1】:

    在 Go 中自定义查看结果

    如果您使用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 pluginN1QL来做。 (注意N1QL 是预览版,尚未正式发布)

    【讨论】:

    • 感谢 Jaemin - 帮助很大
    猜你喜欢
    • 2013-01-19
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多