【问题标题】: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);
    

    注意:在枚举光标之前必须设置这些属性。在后面设置这些将无效。


    顺便说一句,即使您只使用LinqSkipTake,您也不会检索数千个文档。 MongoDB automatically batches 按大小计算的结果(第一批大约是 1mb,其余的是 4mb 每个)所以你只会得到第一批并从中取出前 50 个文档。更多关于


    编辑:我认为这里对LINQ 存在一些混淆:

    获取所有收集并通过 LINQ 执行跳过和获取,这在我们的情况下不起作用,因为我们不想在内存中获取数千条记录。

    SkipTakeIEnumerable IQueryable 的扩展方法。 IEnumerable 用于内存集合, IQueryable 操作是 translated by the specific provider(在这种情况下是 C# 驱动程序)。所以上面的代码等价于:

    foreach (var item in collection.AsQueryable().SetLimit(50))
    {
        // Process item.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-21
      • 2011-10-14
      • 1970-01-01
      • 2023-04-01
      • 2014-12-16
      • 2010-10-04
      • 2012-08-25
      相关资源
      最近更新 更多