如何在沙发基地流式传输阅读

本文关键字:传输 沙发 | 更新日期: 2023-09-27 18:30:34

我想使用单个查询从Couchbase中的查询流式传输一组文档。问题是这可能会返回数百万个文档,因此我想从 Couchbase 逐步获取它们,进行一些轻量级处理,然后将结果写入文件流,从而节省我将整个结果集加载到内存中。有谁知道这在沙发基地是否可行?

编辑:对不起,忘了说我正在尝试用 C# 执行此操作

如何在沙发基地流式传输阅读

目前,直接执行此操作的唯一方法是对查询使用分页来检索块中的结果。这带来了结果集(可能)在页面检索之间更改的明显缺点,如果您有其他一些进程继续在后台更改数据。在 C# 中,它看起来像这样(从内存中键入,如果它没有立即编译,请道歉):

var pageSize = 100;
var pageIndex = 0
IQueryResult<dynamic> result = null;
do {
    var query = string.Format("SELECT myBucket.* FROM myBucket LIMIT {0} OFFSET {1}", pageSize, pageIndex);
    result = await bucket.QueryAsync<dynamic>(query);
    pageIndex += result.Rows != null ? result.Rows.Count : 0;
}
while(result.Success && result.Rows.Count > 0);

您的另一种选择是将所需查询的结果复制到另一个(可能是空的)存储桶中,然后在闲暇时查询/翻页它们,因为副本不会受到原始存储桶更改的影响:

INSERT INTO otherBucket (key _k, value _v) 
SELECT META().ID _k, _v FROM myBucket _v WHERE <your conditions here>;

使用前面描述的分页代码进行操作。