8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何在 Node.js 中使用 Mongoose 进行分页?

Vardana Bhanot 3月前

220 0

我正在使用 Node.js 和 mongoose 编写一个 Web 应用程序。如何对 .find() 调用获得的结果进行分页?我想要一个与 SQL 中的 \'LIMIT 50,100\' 相当的功能。

我正在用 Node.js 和 mongoose 编写一个 webapp。如何对调用结果进行分页 .find() ?我想要一个 "LIMIT 50,100" 与 SQL 相当的功能。

帖子版权声明 1、本帖标题:如何在 Node.js 中使用 Mongoose 进行分页?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Vardana Bhanot在本站《database》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 在仔细研究了 Mongoose API 并参考了 Rodolphe 提供的信息后,我找到了以下解决方案:

    MyModel.find(query, fields, { skip: 10, limit: 5 }, function(err, results) { ... });
    
  • Chris Hinkle 解释了为什么这无法扩展:.com/a/23640287/165330。

  • @ChrisHinkle 似乎所有 DBMS 都是这种情况。链接答案下方的 Lex 评论似乎解释得更清楚。

  • @Avij 是的。我为此使用了标识符。您在此处执行的操作是将最后的记录 ID 发送回服务器,并获取一些 ID 大于发送的记录。由于 ID 已编入索引,因此速度会快得多

  • 我对这个问题中接受的答案感到非常失望。这不会扩展。如果你阅读了 cursor.skip() 的细则:

    cursor.skip() 方法通常很昂贵,因为它要求服务器从集合或索引的开头开始,以获取偏移量或跳过位置,然后才开始返回结果。随着偏移量(例如上面的 pageNumber)的增加,cursor.skip() 将变得更慢,并且更耗 CPU。对于较大的集合,cursor.skip() 可能会成为 IO 限制。

    为了以可扩展的方式实现分页,请结合 limit() 与至少一个过滤条件,createdOn 日期适合多种用途。

    MyModel.find( { createdOn: { $lte: request.createdOnBefore } } )
    .limit( 10 )
    .sort( '-createdOn' )
    
  • 但是,如果不使用 skip,您如何从该查询中获得第二页?如果您每页查看 10 个结果,并且有 100 个结果,那么您如何定义偏移量或跳过值?您没有回答分页的问题,因此您不能“失望”,尽管这是一个有效的警告。虽然 MySQL offset,limit 中也存在同样的问题。它必须先遍历树到偏移量,然后才能返回结果。我会对此持保留态度,如果您的结果集小于 1mil 并且没有可保留的性能损失,请使用 skip()。

  • wyc 3月前 0 只看Ta
    引用 8

    当谈到 mongoose/mongodb 时,我是个新手,但要回答 Lex 的问题,看来,由于结果是按“-createdOn”排序的,因此您需要用上一个结果集中返回的 createdOn 的最小值替换 request.createdOnBefore 的值,然后重新查询。

  • @JoeFrambach 基于 createdOn 的请求似乎有问题。嵌入 Skip 是有原因的。文档仅警告循环遍历 btree 索引对性能的影响,所有 DBMS 都是这种情况。对于用户的问题“与 LIMIT 50,100 相当的 MySQL 内容”,.skip 完全正确。

  • vals 3月前 0 只看Ta
    引用 10

    使用 mongoose、express 和 jade 进行分页 - 这是我博客的链接,有更多详细信息

    var perPage = 10
      , page = Math.max(0, req.params.page)
    
    Event.find()
        .select('name')
        .limit(perPage)
        .skip(perPage * page)
        .sort({
            name: 'asc'
        })
        .exec(function(err, events) {
            Event.count().exec(function(err, count) {
                res.render('events', {
                    events: events,
                    page: page,
                    pages: count / perPage
                })
            })
        })
    
  • 感谢您发布您的答案!请务必仔细阅读有关自我推广的常见问题解答。另请注意,每次链接到您自己的网站/产品时,您都必须发布免责声明。

  • 引用 12

    Math.max(0, undefined) 将返回 undefined ,这对我有用: let limit = Math.abs(req.query.limit) || 10; let page = (Math.abs(req.query.page) || 1) - 1; Schema.find().limit(limit).skip(limit * page)

  • 在接收页面或限制的用户输入时要小心,其中一个可能是 ?limit=1e10000,其计算结果为无穷大,这会导致 Mongoose 抛出 BadValue 错误

  • 引用 14

    你可以像这样链接:

    var query = Model.find().sort('mykey', 1).skip(2).limit(5)
    

    使用执行查询 exec

    query.exec(callback);
    
  • 引用 15

    execFind(function(... 例如: var page = req.param('p'); var per_page = 10; if (page == null) { page = 0; } Location.count({}, function(err, count) { Location.find({}).skip(page*per_page).limit(per_page).execFind(function(err, locations) { res.render('index', { locations: locations }); }); });

  • 注意:这在 mongoose 中不起作用,但在 mongodb-native-driver 中可以起作用。

  • 引用 17

    在这种情况下,您可以将查询 page 和/或 limit 作为查询字符串添加到您的 URL。

    例如:
    ?page=0&limit=25 // this would be added onto your URL: http:localhost:5000?page=0&limit=25

    由于它是 a,因此 String 我们需要将其转换为 a Number 以便进行计算。让我们使用该 parseInt 方法来完成此操作,并提供一些默认值。

    const pageOptions = {
        page: parseInt(req.query.page, 10) || 0,
        limit: parseInt(req.query.limit, 10) || 10
    }
    
    sexyModel.find()
        .skip(pageOptions.page * pageOptions.limit)
        .limit(pageOptions.limit)
        .exec(function (err, doc) {
            if(err) { res.status(500).json(err); return; };
            res.status(200).json(doc);
        });
    

    BTW 分页开始于 0

  • 请将 `{ page: parseInt(req.query.page) || 0, ...} 添加到参数中。

  • @imalik8088 谢谢,不过据我所知,字符串参数已由 mongoose 自动处理。

  • JonH 3月前 0 只看Ta
    引用 20

    @imalik8088 这很奇怪。如果你能指出重现错误,我就可以修改我的答案了。谢谢。

返回
作者最近主题: