gocb:批量获取操作示例

gocb: bulk Get operation example

最近发布的 gocb lib(couchbase 的官方 golang 客户端)提供 API 用于执行批量操作(获取、删除等)。我很想看到这样一个操作的完整示例,唉-我的围棋技术很差,网上也没有。

我希望看到 (1) 编译和 (2) 执行 multi-get 最后 (3) 设法访问从 couchbase 返回的值的片段。

以下是网上存在的少量文档: http://developer.couchbase.com/documentation/server/4.0/sdks/go-beta/bulk-operations.html

以下代码(执行插入)是不够的:我想要 Get(特别是 - 如何查看 get 操作结果的内容)。

myBucket, _ := myCluster.OpenBucket("default", "")

var items []gocb.BulkOp
items = append(items, &gocb.InsertOp{Key: "document_name_1", Value: "Hello World 1"})
items = append(items, &gocb.InsertOp{Key: "document_name_2", Value: "Hello World 2"})

err := bucket.Do(items)

只需将 *InsertOp 值替换为 *GetOp 值,然后读取它们的 Value 字段:

package main

import "fmt"
import "gopkg.in/couchbaselabs/gocb.v1"

func main() {
        getKeys()
}

func getKeys() {
        myCluster, err := gocb.Connect("couchbase://<couchbase-address>")
        if err != nil {
                fmt.Println("cluster error:", err)
        }
        myBucket, err := myCluster.OpenBucket("Test", "") //case sensitive!
        if err != nil {
                fmt.Println("bucket error:", err)
        }

        var items []gocb.BulkOp
        items = append(items, &gocb.GetOp{Key: "document_name_1"})
        items = append(items, &gocb.GetOp{Key: "document_name_2"})

        err = myBucket.Do(items)

        if err != nil {
                fmt.Println("Do error:", err)
                panic(err)
        }

        for _, g := range items {
                //"downcast" the instance back to its concrete type - GetOp
                t := g.(*gocb.GetOp)
                fmt.Println(t)
        }
}

这是一个工作版本,但我认为它很冗长

package main

import (
    "fmt"

    "gopkg.in/couchbase/gocb.v1"
)

const (
    COUCH_OP_COUNT = 3
)

// data interchange with Couchbase store
type StorageUrl struct {
    Url string
}

func storeThings(b *gocb.Bucket) {
    var ops []gocb.BulkOp
    for i := 0; i < COUCH_OP_COUNT; i++ {
        k := fmt.Sprintf("key_%v", i)
        ops = append(ops, &gocb.UpsertOp{
            Key:   k,
            Value: StorageUrl{Url: fmt.Sprintf("http://www.i-%v.com", i)},
        })
    }

    b.Do(ops)
}

func fetchThings(b *gocb.Bucket) {
    var err error
    var ops []gocb.BulkOp
    var results []interface{}
    for i := 0; i < COUCH_OP_COUNT; i++ {
        k := fmt.Sprintf("key_%v", i)
        results = append(results, &StorageUrl{})
        ops = append(ops, &gocb.GetOp{
            Key:   k,
            Value: results[i],
        })
    }

    err = b.Do(ops)
    if err != nil {
        fmt.Println(err)
        return
    }

    for _, op := range ops {
        getOp := op.(*gocb.GetOp)
        v := getOp.Value.(*StorageUrl)
        fmt.Println(v)
    }
}

func main() {
    cluster, err := gocb.Connect("couchbase://127.0.0.1")
    if err != nil {
        fmt.Println(err)
        return
    }

    bucket, err := cluster.OpenBucket("test", "")
    if err != nil {
        fmt.Println(err)
        return
    }

    storeThings(bucket)
    fetchThings(bucket)
}