- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我使用 PHP
和 MySQL
时,我需要选择行数,然后计算总数(对于分页,例如maple),我会执行以下操作:
$rows = DB::getRows('
SQL_CALC_FOUND_ROWS
select *
from posts
where mode = "published"
order by `dateCreated`
limit '.$limit.'
');
然后
$totalRows = DB::getOne('
SELECT FOUND_ROWS()
');
简单易行。
最近我开始从事 nodejs/mongo 项目,我想知道使用 mongoose 实现相同目标的最干净的方法是什么。
现在我的代码如下所示:
var result = {};
var sort = {dateCreated: -1};
var skip = limit * (page - 1);
modelClass.find(function (err, items) {
result.items = items;
modelClass.find().where('mode').equals('published').count(function (err, total) {
result.totalItems = total;
callback([], result);
});
}).where('mode').equals('published').sort(sort).limit(limit).skip(skip);
我不喜欢的是我在 .where('mode').equals('published')
中重复自己。
有更好的方法吗?
最佳答案
似乎您想要对数据进行分页。
检查这个例子:
var async = require('async');
var _ = require('lodash');
function getData(query, page, callback) { // wrap it inside function to reuse it
if(page < 1) page = 1; // make sure page number = 1 if it's out of minimal bounds
var query = _.extend({mode: 'published'}, query); // make it to be able to add additional parameters
var sort = {dateCreated: -1};
var limit = 50;
var skip = limit * (page - 1);
// making 2 parallel calls, not harming readability
async.parallel([ // array of calls
// 0. get count by query and send it to parallel result handler
modelClass
.find(query)
.count()
.exec,
// 1. get records by defined query and send it parallel handler
modelClass
.find(query)
.sort(sort)
.limit(limit)
.skip(skip)
.exec
],
// parallel result handler - callback, results of each function sent by index in array above
function(err, results) {
if(err) {
return callback(err);
}
// aggregating result in easy to use object
var result = {
count: results[0], // where we get count
page: page,
pages: Math.ceil(results[0] / limit),
perPage: limit,
records: results[1] // where we get documents
};
callback(null, result);
});
}
用法:
getData({}, 2, function(err, result) {
console.log('Pages:', result.pages, 'Total records:', result.count);
console.log('Per page:', result.perPage, 'Current page:', result.page);
console.log('Records:', result.records);
});
getData({publishedBy: 'user-id-here'}, 5, function(err, result) {
// same example code
});
附:由于多行代码,这段代码看起来非常庞大。
因此最好有一些全局函数,例如:countRecordsByModel、getRecordsByModel、paginateRecordsByModel
,您可以将模型、查询、页面、回调
作为参数。
它将缩短您的代码以供将来重用。
使上面的所有代码更加灵活,因此只需通过传递 mongoose 模型作为参数、查询、页码和回调函数来调用 paginateRecordsByModel
即可。
采取这段代码:
var async = require('async');
var _ = require('lodash');
function countRecordsByModel(modelClass, query, callback) {
modelClass
.find(query)
.count()
.exec(callback);
}
function getRecordsByModel(modelClass, query, page, callback) {
if(page < 1) page = 1;
var query = _.extend({}, query);
/* or can extend it with default params like:
var query = _.extend({deleted: false}, query); // in my databases I have deleted field, to flag documents as deleted, I delete them physically after a month, by garbage cleaner.
*/
var sort = {dateCreated: -1};
var limit = 50;
var skip = limit * (page - 1);
modelClass
.find(query)
.sort(sort)
.limit(limit)
.skip(skip)
.exec(callback);
}
function paginateRecordsByModel(modelClass, query, page, callback) {
// making 2 parallel calls, not harming readability
async.parallel([ // array of calls
// 0. get count by query and send it to parallel result handler
function(done) {
countRecordsByModel(modelClass, query, done)
},
// 1. get records by defined query and send it parallel handler
function(done) {
getRecordsByModel(modelClass, query, page, done);
}
],
// parallel result handler - callback, results of each function sent by index in array above
function(err, results) {
if(err) {
return callback(err);
}
// aggregating result in easy to use object
var result = {
count: results[0], // where we get count
page: page,
pages: Math.ceil(results[0] / limit),
perPage: limit,
records: results[1] // where we get documents
};
callback(null, result);
});
}
用法:
paginateRecordsByModel(postsModel, {mode: 'published'}, function(err, result) {
console.log('Pages:', result.pages, 'Total records:', result.count);
console.log('Per page:', result.perPage, 'Current page:', result.page);
console.log('Records:', result.records);
});
关于mysql - Mongoosejs : Cleanest way to select rows with `limit` and `where` , 然后获取总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34280996/
这是我的 mongoosejs 架构。我将 name unique 设置为 false,但这就是我得到的: MongoError: insertDocument::引起的::11000 E11000
在进行任何类型的验证之前,我需要清理 MongooseJS 中的字符串。如何访问模型的字段并更改(清理)该字段,然后才对该字段进行验证? 例如,这就是我的模型的样子: var Notification
我找到了多篇文章和指南,称赞使用 populate() 方法在 Mongoose 和 MongoDB 中进行连接的能力。 这让我很困惑。如果你想做连接,你不应该使用 SQL 数据库吗?加入 Mongo
目前我有以下方案模型: var userModel = mongoose.schema({ images: { public: [{url: {type: String}}]}
如何对不同的查询进行排序我试过这个 exports.categories = function(req, res) { Article.distinct({'categories' : tru
我看过this功能。 我可以看到它生成了一个slug,但我不太明白它是如何工作的。在 327 行,它返回来自 Model.findOne 函数的 promise ,但在该 Model.findOne
不知何故,在 mongoose 官方网站上很难找到信息。我想知道有没有教程或引用网站? 另外,一个特殊的问题是,如何在 mongoose 中运行 update() 。 :) 最佳答案 我在一个项目中使
我想知道是否有办法限制(子)文档中的元素数量。在我的应用程序中,可以使用 ajax 将元素添加到子文档,因此防止恶意用户添加大量可笑的条目很重要。 我能想到一种方法,就是查询父文档,检查子文档中的元素
假设我有一个文档,例如:var doc = Model.findOne({name:"name"}); 现在,如果文档通过数据库的另一个连接进行编辑,则 doc 不包含正确的信息。我确实需要它,所以我
我有如下 MongooseJS 模式: var UserSchema = new Schema({ name : String, app_key
我想我在使用 mongoosejs 时遇到了麻烦。我试图将一个对象数组保持在特定大小 2。调用此函数时,它会向数组添加一个项目,并在必要时将其缩小。但是,当我保存数组时,大小不会缩减为 2。按照代码和
目前我在引用对象中的文本索引时遇到问题这是代码 架构 var UserSchema = new mongoose.Schema({ username: String, fullname
我有一个用于 Lists 的 MongooseJS 架构,其中每个列表都包含一个 ListItems 数组。每个 ListItem 只是对 Item 的引用和 isSelected 的标志。像这样:
我正在尝试填充嵌套在其他引用中的引用。我已经可以工作了,但看起来有点老套,想知道是否还有其他方法可以实现这一点: return Q.ninvoke(BoardSchema, 'find', {'_id
使用 Mongoose 作为 NodeJS 的 ODM,但不完全理解错误处理的工作原理。它可以工作,但看起来不正确,并且不符合文档,所以我担心走这条路以后会困扰我。 例如,以下是基本登录路线: app
我是 mongodb 和 mongoose 的新手,我在获取子子数组时遇到了麻烦。 我的数据是这样的: [ {_id : ..., name : 'Category nam
Request.findOne({_id: id}).populate("user").exec(function(err, request) { if (!err) { re
假设我有一个如下所示的 ABC 架构: ABC = mongoose.Schema ({ name: String , x: String , y: String ,
这个问题已经有答案了: How do you turn a Mongoose document into a plain object? (9 个回答) mongoose .find() method
我正在编写一个应用程序,使用 Node.js 和 MongooseJS 作为处理数据库调用的中间件。 我的问题是我有一些嵌套模式,其中一个以错误的方式填充。当我跟踪人口的每一步时 - 所有数据都很好,
我是一名优秀的程序员,十分优秀!