从 Couchbase 桶中批量读取文档

Reading documents from the Couchbase bucket as batches

我有一个 Couchbase 集群,其中包含大约 2500 万个文档。我能够按顺序读取它们,而且我有一个函数可以从数据库中读取特定数量的文档。但我的用例略有不同,因为我无法将所有 25M 文档(每个文档都很大)存储在内存中。

我需要分批处理文档,比如1M/批,将那批推送到我的内存中,(对那些文档进行一些操作)然后推送下一批。

我编写的用于读取特定数量文档的函数不能确保它 returns 再次调用时是一组不同的文档。

有什么方法可以完成这个功能吗?我还有一个可以批量创建文档的功能。我不确定我是否可以写一个类似的函数,可以批量读取文档。下面给出函数。

public void createMultipleCustomerDocuments(String docId, Customer myCust, long numDocs) {

        Gson gson = new GsonBuilder().create();
        JsonObject content = JsonObject.fromJson(gson.toJson(myCust));
        JsonDocument document = JsonDocument.create(docId, content);
        jsonDocuments.add(document);
        documentCounter++;

        if (documentCounter == numDocs) {
            Observable.from(jsonDocuments).flatMap(new Func1<JsonDocument, Observable<JsonDocument>>() {
                public Observable<JsonDocument > call(final JsonDocument docToInsert) {
                    return (theBucket.async().upsert(docToInsert));
                }
            }).last().toBlocking().single();

            documentCounter = 0;
            //System.out.println("Batch counter: " + batchCounter++);

        }

有人可以帮我解决这个问题吗?

我会尝试创建一个包含所有文档的视图,然后使用 skip 和 limit 查询该视图。 (可以使用 .startKey()startKeyId() 函数代替 skip() 以避免开销。)

但是,请记住不要在生产环境中保留该视图,这将是 cpu 猪。

另一种选择,使用 DCP 协议将数据库复制到您的应用程序中。但这是更多的工作。