【问题标题】:NodeJS Pagination with distinct()NodeJS分页与distinct()
【发布时间】:2014-10-16 02:45:03
【问题描述】:

我从 mongoDB 获得 dta,并且正在使用 JSON API 进行分页(显示 id)。

我用require('mongoose-query-paginate');

var query = Cars.find().distinct('folder');
query.paginate(options, function(err, ids) {
    res.status('ids').send({
          ids: ids
        });
});

Error: skip cannot be used with distinct
at Query._validate (C:\nodejs\node_modules\mongoose\node_modules\mquery\lib\mquery.js:2405:11)
        ...

我在使用 skip() 和 distinct 时遇到问题(冲突?)。

我该如何解决? 谢谢!

【问题讨论】:

    标签: node.js mongodb pagination


    【解决方案1】:

    distinct 是一个特殊用途的聚合函数,它返回一个数组而不是一个游标,它不接受跳过或限制参数。您将无法对它使用分页。相反,您可以构造一个等效的聚合管道,它将为 MongoDB >= 2.6 返回一个游标:

    > db.cars.aggregate([{ "$group" : { "_id" : "$folder" } }])
    

    这种游标也不接受跳跃和限制,但您可以使用$skip$limit 管道阶段来制作页面:

    > db.cars.aggregate([
        { "$group" : { "_id" : "$folder" } }
        { "$skip" : 691 },
        { "$limit" : 37 }
    ])
    

    最后一点,使用 $skip 和 $limit 进行分页是低效的。更好的解决方案是使用 $sort 并将每一页检索为接下来的 N 条记录 > 前一页上的最大记录。这也可以通过使用 $sort 阶段的聚合来完成。

    【讨论】:

    • 感谢您的帮助,但我仍有问题:TypeError: Object # has no method 'paginate' 。查询工作正常 console.log(query) 但是当 query.paginate(options, function(err, ids)... 时出现错误...
    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多