猿问

Couchbase gocb 批量操作提供部分为空的结果

在我们使用 gocb 的 go 代码中,我们正在查询一个返回 32k id 的视图。然后我们执行批量查询(参见下面的代码),如CouchBase 博客文章中所述。但是,我们只能得到部分结果。我们可以看到ruleset, _ := items[i].(*gocb.GetOp).Value.(*RuleSet)只返回前 2048 个 id 的值。然后 ids 2049 - 11322 不包含值等等。我们的结果看起来像这样:

Line 1 Key: 12345678901234567890123456789012, Value: map[0.0.0.0/0:map[jsona:valueofjsona]]

...

Line 2018 Key: 12345678901234567890123456712345, Value: map[0.0.0.0/0:map[jsona:valueofjsona]]

Line 2019 Key: 12345678901234567890123456712345, Value: map[]

...

Line 11323 Key: 12345678901234567890123456712347, Value: map[jsonb:valueofjsonb]]

(以上几行是简化的,键与实际数据不匹配,值也不匹配。)


很大一部分请求的数据实际上并没有返回:


CB# grep '\[\]' result.out |wc -l

27042

CB# wc -l result.out

31988 rdmp.out

bucket.do在完成所有查询处理之前是否返回?我们查看了 API 代码,但找不到解释。


知道如何解决这个问题吗?


type RuleSet struct {

    Rules map[string]interface{} "json:\"rules,\""

}


func DiffViaBulkQuery() {

  var items []gocb.BulkOp

  var row interface{}

  var cnt int = 0

  bucket := cbase.MyBucket()


// [...]

// add 600k entries to itemsget in a loop like 

// itemsGet = append(itemsGet, &gocb.GetOp{Key: key + "_" + strconv.Itoa(i), Value: &Doc{}})



// Perform the bulk operation to Get all documents

  err = bucket.Do(itemsGet)

  if err != nil {

    fmt.Println("ERRROR PERFORMING BULK GET:", err)

  }


// Print the output

  for i := 0; i < len(itemsGet); i++ {

    fmt.Println(itemsGet[i].(*gocb.GetOp).Key, itemsGet[i].(*gocb.GetOp).Value.(*Doc).Item)

  }

提前致谢, Torsten


qq_笑_17
浏览 126回答 0
0回答
随时随地看视频慕课网APP

相关分类

Go
我要回答