golang couchbase gocb.RemoveOp - 不会删除全部

时间:2016-01-13 12:55:43

标签: go couchbase

我觉得我在某个地方犯了一个愚蠢的错误,但是已经很久没想到了:(代码很粗糙,我只是测试一下。 它删除了,但由于某些原因并非所有文件,我已经重写了一个接一个地删除它,那就没问题了。 我使用Couchbase的官方包http://github.com/couchbase/gocb 这是代码:

var items []gocb.BulkOp
myQuery := gocb.NewN1qlQuery([Selecting ~ 283k documents from 1.5mln])
rows, err := myBucket.ExecuteN1qlQuery(myQuery, nil)
checkErr(err)
var idToDelete map[string]interface{}

for rows.Next(&idToDelete) {
    items = append(items, &gocb.RemoveOp{Key: idToDelete["id"].(string)})
}

if err := rows.Close(); err != nil {
    fmt.Println(err.Error())
}
if err := myBucket.Do(items);err != nil {
    fmt.Println(err.Error())
}

这样它删除了~70k文件,我再次运行它删除了43k以上..

然后我让它一个一个地删除,它运行良好:

//var items []gocb.BulkOp
myQuery := gocb.NewN1qlQuery([Selecting ~ 180k documents from ~1.3mln])
rows, err := myBucket.ExecuteN1qlQuery(myQuery, nil)
checkErr(err)
var idToDelete map[string]interface{}
for rows.Next(&idToDelete) {
  //items = append(items, &gocb.RemoveOp{Key: idToDelete["id"].(string)})
  _, err := myBucket.Remove(idToDelete["id"].(string), 0)
  checkErr(err)
}

if err := rows.Close(); err != nil {
  fmt.Println(err.Error())
}
//err = myBucket.Do(items)

1 个答案:

答案 0 :(得分:1)

默认情况下,针对N1QL的查询使用名为' request plus'的一致性级别。因此,第二次运行程序进行查询将使用查询时有效的索引更新,而不是通过等待索引是最新的来考虑所有先前的突变。您可以在Couchbase's Developer Guide中详细了解这一点,看起来您希望将RequestPlus parameter添加到您的myquery through the consistency method on the query

这种最终一致的二级索引和灵活性非常强大,因为它使您作为开发人员能够决定您希望支付的一致性级别,因为索引重新计算会产生成本。