Nodejs mongoose Model.find() skip与sort的命令失败。

Nodejs mongoose Model.find() skip与sort的命令失败。

仿照nodeclude的首页代码想要实现分页功能。调用Model.find(query, callback)操作如下: XXX.find({skip: 0, limit: 20, sort: “-createtime”}, function() {…}); 但是上面这种方式查询的结果为空。 如果query的值是{}, 或者{name: “xiaoming”}这样的按值查询,都没有问题。sort, limit, skip等操作都会有问题,即查询结果为空……求问为什么?!

mongoose的版本是3.8.16, mongodb的版本是2.6。


7 回复

根据你的描述,你在使用 Model.find() 方法时尝试结合 skiplimitsort 参数,但遇到了问题。实际上,skiplimit 参数应该作为方法的第二个参数传入,而不是作为查询条件的一部分。同时,sort 应该以对象的形式传递。

下面是正确的使用方式:

示例代码

const XXX = require('./models/XXX'); // 假设你已经定义了模型

// 分页参数
const page = 1; // 当前页码
const limit = 20; // 每页显示数量

// 计算跳过的记录数
const skip = (page - 1) * limit;

// 执行查询
XXX.find({}, null, { skip, limit, sort: { createtime: -1 } }, function(err, docs) {
    if (err) {
        console.error('查询失败:', err);
    } else {
        console.log('查询结果:', docs);
    }
});

解释

  1. find() 方法:

    • 第一个参数是一个查询条件对象(这里是空对象 {})。
    • 第二个参数是选择字段(这里是 null,表示选择所有字段)。
    • 第三个参数是一个选项对象,包含 skiplimit 参数。
    • 第四个参数是回调函数,处理查询结果或错误。
  2. 排序 (sort):

    • 排序应通过对象形式传递给 sort 参数,例如 { createtime: -1 } 表示按 createtime 字段降序排列。
  3. 分页逻辑:

    • skip 的计算公式 (page - 1) * limit 确保每一页的记录从正确的起始位置开始。

可能的问题

  • 确认数据库中确实有数据。
  • 确认 createtime 字段存在且格式正确。
  • 确认 XXX 模型已正确连接到数据库。

通过这种方式,你应该能够正确地实现分页和排序功能。希望这可以帮助你解决问题。


应该是XXX.find({skip: 0, limit: 20, sort:{ “-createtime”:1}, function() {…});

XXX.find({},null,{skip: 0, limit: 20, sort:{ "-createtime":1}}, function() {...});   
应该是这样吧
Model.find(conditions, [fields], [options], [callback])
Parameters:

conditions <Object>
[fields] <Object> optional fields to select
[options] <Object> optional
[callback] <Function>

我一般很少这么写, 还是喜欢链式调用.

XXX.find().skip(0).limit(20).sort({"-createtime":1}).exec(function(){…})

… if(…) where = …; if(…) where = …; var query = Test.find(where).skip(skip).limit(limit).sort(sort); query.exec(cb); …

我想说,多看官方文档呀。。

根据你的描述,你在使用 Model.find() 方法时遇到了 skipsort 参数无效的问题。在 Mongoose 中,这些选项应该通过查询对象之外的参数来指定。你可以参考以下示例来实现分页和排序。

示例代码

const mongoose = require('mongoose');
const XXX = mongoose.model('XXX', new mongoose.Schema({ name: String, createtime: Date }));

// 实现分页和排序
XXX.find({}, {}, { skip: 0, limit: 20, sort: { createtime: -1 } }, (err, docs) => {
    if (err) {
        console.error(err);
        return;
    }
    console.log(docs);
});

解释

  • find({}, {}, { skip: 0, limit: 20, sort: { createtime: -1 } }):
    • 第一个 {} 是查询条件,空对象表示匹配所有文档。
    • 第二个 {} 是投影(projection),这里留空表示选择所有字段。
    • 第三个参数是一个对象,用于指定分页 (skiplimit) 和排序 (sort) 选项。

常见错误

  1. 参数位置错误:

    • 你原来尝试将 skip, limit, sort 直接放在查询条件中,这会导致查询条件不正确。
  2. Mongoose 版本差异:

    • 尽管你使用的是较旧的 Mongoose 版本(3.8.16),但上面的方法仍然有效。如果你升级到最新版本,API 可能会有小的变化,但基本原理不变。

通过上述调整,你应该能够成功实现分页和排序功能。希望这能解决你的问题。

回到顶部