如何返回Sequelize中树节点的子节点数?
我有一个像这样定义的分层树数据结构:
module.exports = function(sequelize, DataTypes) { var Category = sequelize.define('Category', { id: { type: DataTypes.STRING, primaryKey: true }, parent: DataTypes.STRING, text: DataTypes.STRING } ); Category.belongsTo(Category, { foreignKey: 'parent' }); return Category; };
我有一个服务返回给定节点的子节点列表,如下所示:
exports.categoryChildren = function(req, res) { var id = req.params.id; db.Category.findAll({ where: { parent: id }}).success(function(categories){ return res.jsonp(categories); }).error(function(err){ return res.render('error', { error: err, status: 500 }); }); };
有没有办法让Sequelize为给定节点的每个孩子(即给定节点的孙辈)返回孙子的数量?
我使用的SQL查询如下所示:
SELECT *, (select count(*) from Categories chld where chld.parent = cat.id) FROM `Categories` cat WHERE cat.`parent`='my_node_id';
但是,我找不到强制Sequelize生成这样的查询的方法。
我结束了使用两个嵌套的查询,如下所示。
优点:我留在ORM范例之内。
缺点:明显的性能下降。
exports.categoryChildren = function(req, res) { var id = req.params.id; db.Category.findAll({ where: { parent: id }}).success(function(categories) { var categoryIds = []; _.each(categories, function(element, index, list) { categoryIds[element.id] = element; }); db.Category.findAll({attributes: [['Categories.parent', 'parent'], [Sequelize.fn('count', 'Categories.id'), 'cnt']], where: { parent: { in: _.keys(categoryIds) }}, group: ['Categories.parent']}).success(function(counts) { _.each(counts, function(element, index, list) { categoryIds[element.dataValues.parent].dataValues.cnt = element.dataValues.cnt; }); return res.jsonp(categories); }).error(function(err){ return res.render('error', { error: err, status: 500 }); }); }).error(function(err){ return res.render('error', { error: err, status: 500 }); }); };
我遇到了同样的问题。 到目前为止,我唯一能想到的就是使用原始查询。
只有一些ORM不能做的事情,我想这可能就是其中的一个。 你可以使用query()
sequelize.query('select * from all_counts').success(function(counts) {...})
只是没有使用ORM来计算这种东西。 这是性能灾难。
使用数据库查询(如您指定的SQL)并为该SQL定义视图,并使用模型来处理该视图。
- 使用来自mysql数据库的NodeJs在html / js文件中显示数据
- 当你连接时调用`release`而不是`destroy`?
- 节点JS MySQLauthentication
- event.js 85扔呃; / /未处理的错误事件在MySQL服务器
- 在Nodejs中没有关于任何其他用户的最新发布信息
- 在Mac Osx中安装msql
- Node Js + MySql + Express – app.use(bodyParser()); 没有定义 – 错误build立连接到新的SQL方法
- Nodejs + Passport + MySQL
- Node.Js ER_NOT_SUPPORTED_AUTH_MODE错误? 在MAMP上完美工作