如何访问couchbase视图中的值?

时间:2015-02-26 07:37:37

标签: view go couchbase

我有一个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. 确定我可以用"数据"做什么的最好方法是什么?变量?我怀疑它是整数索引行的列表,每个行都包含一个键/值映射,其中值可以是不同类型。我看到map [string] interface {}有很多简单的例子,但这似乎有一个额外的间接层。在C,IMHO中很容易理解,但界面{} {}让我感到困惑。
  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)
    
  4. 是否可以使用View()进行类似的操作?

    1. 有人知道将View机制灵活地挂钩到net / http REST处理程序的好方法吗?只是希望..
    2. 我没有在golang客户端API示例或文档中找到这些问题。我可能错过了什么。如果有人有链接,请告诉我。

      感谢您的帮助!

1 个答案:

答案 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 pluginN1QL来执行此操作。 (注意N1QL是预览版,尚未正式发布)