golang couchbase gocb.RemoveOp - 不删除所有

golang couchbase gocb.RemoveOp - doesnt removes all

我想我在某个地方犯了一个愚蠢的错误,但很长一段时间都想不通:(代码很粗糙,我只是在测试东西。 它删除了,但由于某些原因不是所有文件,我已经重写以将其一一删除,并且成功了。 我使用 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 的查询使用称为 'request plus' 的一致性级别。因此,您第二次 运行 要查询的程序将使用查询时有效的任何索引更新,而不是通过等到索引更新来考虑您之前的所有突变。您可以在 Couchbase's Developer Guide and it looks like the you'll want to add the RequestPlus parameter to your myquery through the consistency method on the query.

中阅读更多相关信息

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