2016-01-16 2 views
0

Я хочу передать пакет документов из запроса в Couchbase, используя один запрос. Проблема в том, что это может вернуть пару миллионов документов, и поэтому я хочу постепенно их получать из Couchbase, выполнять небольшую обработку, а затем записывать результат в поток файлов, тем самым избавляя меня от загрузки всего набора результатов в память. Кто-нибудь знает, возможно ли это в Couchbase?Как читать потоки в Couchbase

изменения: извините, забыл сказать, что я пытаюсь сделать это в C#

ответ

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>; 

Следуйте за этим с кодом поискового вызова, описанным ранее.

+0

Я был обеспокоен тем, что это будет так. –

Смежные вопросы