使用 MongoDB 获取总结果计数并允许在同一查询中分页

Jed*_*iah 4 .net c# linq mongodb mongodb-.net-driver

我的查询设置如下以允许分页。虽然这有效,但我基本上必须运行相同的查询两次才能获得查询的总匹配结果并允许分页。有什么方法可以将其合并到一个查询中吗?

public SearchResult GetResults()
{
    //query is built elsewhere
    var totalResults = (from i in Collection.Find(query)
        select i).Count();

    var results = (from i in Collection.Find(query)
        select i)
        .Skip(recordsToSkip)
        .Take(recordsToTake)
        .ToList();

    //SearchResult is defined elsewhere
    return new SearchResult
    {
        Results = results,
        TotalResults = totalResults
    };
}
Run Code Online (Sandbox Code Playgroud)

i3a*_*non 5

首先,要获取计数,您不应该先执行 linq 查询,然后再对结果进行计数。这种方式是枚举所有的结果,然后进行统计,成本较高。你应该使用:

var totalResults = Collection.Find(query).Count()
Run Code Online (Sandbox Code Playgroud)

Count方法是在MongoCursor其自身上定义的,并将在 mongo 中计算结果,而不是在您的 .Net 应用程序中。

我想这才是问题背后的真正问题。但如果您仍然想合并这两个查询,您可以这样做:

var results = (from i in Collection.Find(query) select i).ToList();
var totalResults = results.Count();
var page = results
    .Skip(recordsToSkip)
    .Take(recordsToTake)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

这将获取整个集合,对其进行计数,然后返回其中的一页。但我不建议您这样做,因为您不需要整个集合。

PS:当您对 Find 的结果使用 Linq 时,它会在您的应用程序中而不是在数据库中进行过滤,因此您应该将查询更改为以下查询:

var results = Collection.Find(query)
    .SetSkip(recordsToSkip)
    .SetLimit(recordsToTake)
    .ToList();
Run Code Online (Sandbox Code Playgroud)