如何在Couchbase

时间:2016-01-16 09:24:02

标签: c# couchbase

我想使用单个查询从Couchbase中的查询中流式传输一组文档。问题是这可能会返回几百万个文档,所以我想逐渐从Couchbase中获取它们,进行一些轻量级处理,然后将结果写入文件流,从而避免将整个结果集加载到内存中。有谁知道Couchbase中是否可以这样做?

编辑:对不起,忘了说我试图用C#

来做这件事

1 个答案:

答案 0 :(得分:1)

目前,直接执行此操作的唯一方法是在查询上使用分页以块的形式检索结果。如果您有一些其他进程继续在后台更改数据,那么结果集的明显缺点(可能)会在页面检索之间发生变化。在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>;

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