【问题标题】:Efficient way of paging with MongoDB and ASP.NET MVC使用 MongoDB 和 ASP.NET MVC 进行分页的高效方法
【发布时间】:2014-08-07 08:38:30
【问题描述】:
我们正在创建一个应用程序 MongoDB 作为数据库,我们正在使用 official C# driver for MongoDB。我们有一个包含数千条记录的集合,我们想要创建带有分页的列表。我已经阅读了文档,但没有使用 MongoDB C# 官方驱动程序进行分页的有效方法。
我的要求是从数据库中准确地获取 50 条记录。我见过很多例子,但是通过 LINQ 获取所有收集并执行跳过和获取,这在我们的案例中不起作用,因为我们不想在内存中获取数千条记录。
请提供任何示例代码或链接。任何帮助将不胜感激。
提前感谢您的帮助。
【问题讨论】:
标签:
asp.net
asp.net-mvc
linq
mongodb
mongodb-.net-driver
【解决方案1】:
您可以在表示查询的光标上使用SetLimit。这将限制来自MongoDB 的结果,而不仅仅是在内存中:
var cursor = collection.FindAll(); // Or any other query.
cursor.SetLimit(50); // Will only return 50.
foreach (var item in cursor)
{
// Process item.
}
您还可以使用SetSkip 设置跳过(令人惊讶):
cursor.SetSkip(10);
注意:在枚举光标之前必须设置这些属性。在后面设置这些将无效。
顺便说一句,即使您只使用Linq 的Skip 和Take,您也不会检索数千个文档。 MongoDB automatically batches 按大小计算的结果(第一批大约是 1mb,其余的是 4mb 每个)所以你只会得到第一批并从中取出前 50 个文档。更多关于
编辑:我认为这里对LINQ 存在一些混淆:
获取所有收集并通过 LINQ 执行跳过和获取,这在我们的情况下不起作用,因为我们不想在内存中获取数千条记录。
Skip 和 Take 是 IEnumerable 和 IQueryable 的扩展方法。 IEnumerable 用于内存集合,但 IQueryable 操作是 translated by the specific provider(在这种情况下是 C# 驱动程序)。所以上面的代码等价于:
foreach (var item in collection.AsQueryable().SetLimit(50))
{
// Process item.
}