Проблема оказалась не в «запросе с использованием логического свойства», а в «попытке получить результаты запроса с примерно 200 000 результатов».
Есть несколько вариантов сделать это. Самый простой способ , когда в запросе все еще достаточно мало результатов , - использовать метод StreamAsync
. Используя C# 8 (и версию 2.x API Google.Cloud.Firestore, которые поддерживают более новую версию IAsyncEnumerable<>
), вы можете просто использовать такой код:
var stream = collection.WhereEqualTo("IsGoodFoo", true).StreamAsync();
await foreach (var document in stream)
{
// Do whatever with the document
}
В моем тестировании (с результатом запроса 900K +), который истекает через минуту после извлечения ~ 210K элементов. Мне пока не ясно, ожидаемо это или нет.
Более надежной альтернативой является выдача запросов с ограничением и курсором до тех пор, пока запрос не получит этот предел. Вот пример этого:
int limit = 1000;
var query = collection.WhereEqualTo("IsGoodFoo", true).Limit(limit);
// Used to specify a cursor
DocumentSnapshot lastDocument = null;
while (true)
{
var queryWithCursor = lastDocument is null ? query : query.StartAfter(lastDocument);
var querySnapshot = await queryWithCursor.GetSnapshotAsync();
foreach (var document in querySnapshot)
{
// Use the document
}
if (querySnapshot.Count != limit)
{
break;
}
}
Обратите внимание, что, хотя вы можете указать Offset
вместо использования курсора, это становится значительно менее эффективным, когда смещение очень велико.