golang couchbase gocb.RemoveOp-不删除所有

golang couchbase gocb.RemoveOp-不删除所有,go,couchbase,Go,Couchbase,我想我在某个地方犯了一个愚蠢的错误,但已经很长时间不知道在哪里了:(代码很粗糙,我只是在测试东西。 它删除了,但由于某些原因,并不是所有的文档都被删除了,我已经重写了,一个接一个地删除了所有的文档,一切正常。 我使用Couchbase的官方软件包 以下是代码: var items []gocb.BulkOp myQuery := gocb.NewN1qlQuery([Selecting ~ 283k documents from 1.5mln]) rows, err := myBucket.Ex

我想我在某个地方犯了一个愚蠢的错误,但已经很长时间不知道在哪里了:(代码很粗糙,我只是在测试东西。 它删除了,但由于某些原因,并不是所有的文档都被删除了,我已经重写了,一个接一个地删除了所有的文档,一切正常。 我使用Couchbase的官方软件包 以下是代码:

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”的一致性级别。因此,您第二次运行程序进行查询时,将使用查询时有效的索引更新,而不是等待索引更新以考虑您以前的所有变化。您可以在e您将要将添加到myquery的


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

每当您使用不在std中的包时,最好在您的包文档中添加链接r问题。当然,添加了包名。