我有一项任务,我需要查询大量数据。我为查询创建了一个方法:
public List<T> Query(FilterDefinition<T> filter, SortDefinition<T> sort, int limit)
{
var query = Collection.Find(filter).Sort(sort).Limit(limit);
var result = query.ToList();
return result;
}
主要方法:
List<Cell> cells = MyDatabaseService.Query(filter, sort, 100000);
此列表将包含100000个非常大的值。
另一方面,我也可以使用:
public async Task<IAsyncCursor<T>> QueryAsync(FilterDefinition<T> filter, SortDefinition<T> sort, int limit)
{
FindOptions<T> options = new FindOptions<T> { Sort = sort, Limit = limit };
var queryCursor = await Collection.FindAsync(filter, options);
return queryCursor;
}
在main中,然后我使用while循环来迭代光标。
Task<IAsyncCursor<Cell>> cursor = MyDatabaseService.QueryAsync(filter, sort, 100000);
while (await cursor.MoveNextAsync())
{
var batch = queryCursor.Current;
foreach (var document in batch)
{
}
}
因此,考虑到我要查询大量数据,使用第二个实现是否是一个好主意?谢谢你的回复。
答案 0 :(得分:1)
一旦您从服务器检索文档,这实际上取决于您计划对文档执行的操作。
如果您需要执行一项操作,要求所有100,000个文档都在程序的内存中,那么这两种方法基本上会做同样的事情。
另一方面,如果您逐个使用返回的文档,第二种方法更好:第一种方法基本上处理每个文档两次(一次将其与所有其他文档一起检索,一次处理它) ;第二个将处理一次(检索并立即采取行动)。