2015-10-11 61 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) 
}