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。
根据你的描述,你在使用 Model.find()
方法时尝试结合 skip
、limit
和 sort
参数,但遇到了问题。实际上,skip
和 limit
参数应该作为方法的第二个参数传入,而不是作为查询条件的一部分。同时,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);
}
});
解释
-
find() 方法:
- 第一个参数是一个查询条件对象(这里是空对象
{}
)。 - 第二个参数是选择字段(这里是
null
,表示选择所有字段)。 - 第三个参数是一个选项对象,包含
skip
和limit
参数。 - 第四个参数是回调函数,处理查询结果或错误。
- 第一个参数是一个查询条件对象(这里是空对象
-
排序 (
sort
):- 排序应通过对象形式传递给
sort
参数,例如{ createtime: -1 }
表示按createtime
字段降序排列。
- 排序应通过对象形式传递给
-
分页逻辑:
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()
方法时遇到了 skip
和 sort
参数无效的问题。在 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),这里留空表示选择所有字段。 - 第三个参数是一个对象,用于指定分页 (
skip
和limit
) 和排序 (sort
) 选项。
- 第一个
常见错误
-
参数位置错误:
- 你原来尝试将
skip
,limit
,sort
直接放在查询条件中,这会导致查询条件不正确。
- 你原来尝试将
-
Mongoose 版本差异:
- 尽管你使用的是较旧的 Mongoose 版本(3.8.16),但上面的方法仍然有效。如果你升级到最新版本,API 可能会有小的变化,但基本原理不变。
通过上述调整,你应该能够成功实现分页和排序功能。希望这能解决你的问题。