查询方法应该返回Cursor还是List? (Mongo DB C#)

时间:2016-10-19 07:07:24

标签: c# mongodb asynchronous

我有一项任务,我需要查询大量数据。我为查询创建了一个方法:

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)
    {

    }
}

因此,考虑到我要查询大量数据,使用第二个实现是否是一个好主意?谢谢你的回复。

1 个答案:

答案 0 :(得分:1)

一旦您从服务器检索文档,这实际上取决于您计划对文档执行的操作。

如果您需要执行一项操作,要求所有100,000个文档都在程序的内存中,那么这两种方法基本上会做同样的事情。

另一方面,如果您逐个使用返回的文档,第二种方法更好:第一种方法基本上处理每个文档两次(一次将其与所有其他文档一起检索,一次处理它) ;第二个将处理一次(检索并立即采取行动)。