如何在 Couchbase 中流式读取
How to stream reads in Couchbase
我想使用单个查询从 Couchbase 中的查询流式传输一组文档。问题是这可能 return 几百万个文档,所以我想逐渐从 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);
您的另一个选择是将所需查询的结果复制到另一个可能是空的存储桶中,然后 query/page 在您有空的时候通过它们,因为副本不会受到对原始存储桶的更改的影响:
INSERT INTO otherBucket (key _k, value _v)
SELECT META().ID _k, _v FROM myBucket _v WHERE <your conditions here>;
使用前面描述的分页代码跟进。
我想使用单个查询从 Couchbase 中的查询流式传输一组文档。问题是这可能 return 几百万个文档,所以我想逐渐从 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);
您的另一个选择是将所需查询的结果复制到另一个可能是空的存储桶中,然后 query/page 在您有空的时候通过它们,因为副本不会受到对原始存储桶的更改的影响:
INSERT INTO otherBucket (key _k, value _v)
SELECT META().ID _k, _v FROM myBucket _v WHERE <your conditions here>;
使用前面描述的分页代码跟进。