golang couchbase gocb.RemoveOp - 不删除所有

标签 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)

最佳答案

默认情况下,针对 N1QL 的查询使用称为“请求加”的一致性级别。因此,您第二次运行该程序进行查询时,将使用查询时有效的任何索引更新,而不是等到索引更新后才考虑您之前的所有突变。您可以在 Couchbase's Developer Guide 中阅读更多相关信息看起来你会想要添加 RequestPlus parameter到你的 myquery through the consistency method on the query .

这种最终一致的二级索引和灵 active 非常强大,因为它使您作为开发人员能够决定您想要支付的一致性级别,因为索引重新计算是有成本的。

关于golang couchbase gocb.RemoveOp - 不删除所有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767338/

相关文章:

go - Go 的竞争检测器如何感知锁定?

map - 使用接口(interface)动态映射 YAML 的更简单方法?

Golang 使用返回两个变量的函数

模拟集群节点故障后 Couchbase 丢失数据

java - spring-data-couchbase - 使用 java.util.Date 方法参数的 N1QL 查询

mysql - 可扩展的启动持久性

go - 如何让 logrus 打印 pkg/errors 堆栈

couchbase - 模拟连接如何在 Couchbase 中工作?

java - 模拟沙发床

go - 为什么用指针分配接口(interface)然后分配地址在 Golang 中显示不同的行为