2015-10-11 66 views
2

最近发布的gocb lib(用于couchbase的官方golang客户端)提供了用于执行批量操作(Get,Delete等)的API。我很想看到这样一个操作的完整例子,唉 - 我的技能缺乏,网上没有任何东西。 (1)编译和(2)执行multi-get,最后(3)管理访问从couchbase返回的值的代码片段。gocb:bulk获取操作示例

这里就是小文件存在在线: http://developer.couchbase.com/documentation/server/4.0/sdks/go-beta/bulk-operations.html

下面的代码(执行INSERT)是不够的:我想要获取(特别 - 一个将如何审查得到运算结果的内容)。

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) 

回答

1

只是*GetOp值替换*InsertOp值,然后阅读他们的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) 
     } 
} 
+0

道歉:但这不会编译。具体而言:您无法访问g中的值:实例g的类型为gocb.BulkOp,它没有该字段。 – FuzzyAmi

+0

Welp,对不起。忘记那里的类型断言。编辑。 – thwd

+0

谢谢! (我将进一步编辑代码以创建一个完全独立的示例)。也许会让它更加冗长。 – FuzzyAmi

0

这是一个工作版本,但我认为这是相当冗长

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) 
}