Mysql 如何返回Sequelize中树节点的子节点数?
我有一个分层树数据结构,定义如下:Mysql 如何返回Sequelize中树节点的子节点数?,mysql,sql,node.js,sequelize.js,Mysql,Sql,Node.js,Sequelize.js,我有一个分层树数据结构,定义如下: module.exports = function(sequelize, DataTypes) { var Category = sequelize.define('Category', { id: { type: DataTypes.STRING, primaryKey: true }, parent: DataTypes.STRING, text: DataTypes.STRI
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 });
});
};
SELECT *, (select count(*) from Categories chld where chld.parent = cat.id)
FROM `Categories` cat
WHERE cat.`parent`='my_node_id';
我有一个服务返回给定节点的子节点列表,如下所示:
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 });
});
};
SELECT *, (select count(*) from Categories chld where chld.parent = cat.id)
FROM `Categories` cat
WHERE cat.`parent`='my_node_id';
是否有方法使Sequelize返回给定节点的每个子节点(即给定节点的子节点)的子节点数
我将使用的SQL查询如下所示:
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 });
});
};
SELECT *, (select count(*) from Categories chld where chld.parent = cat.id)
FROM `Categories` cat
WHERE cat.`parent`='my_node_id';
但是,我找不到强制Sequelize生成这样的查询的方法。我遇到了同样的问题。到目前为止,我唯一能做的就是使用原始查询 只是有些事情我们做不到,我想这可能就是其中之一。您只需使用
query()
我最终使用了两个嵌套查询,如下所示 优点:我坚持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来计算那种东西。这是一场性能灾难
使用数据库查询(如您指定的SQL)并为该SQL定义视图,并使用模型处理该视图。原始SQL查询是一种很好的回退策略。如果性能有问题,我会解决的。然而,我担心的是,我将不得不硬编码表名,基本上将DB模式暴露在代码中,而这正是我希望通过使用ORM避免的。是的,我使用ORM可以在一些地方使事情变得更简单。您会发现,几乎不可能找到最终不需要编写一些原始查询来提高性能的ORM。现在有一个npm包来解决此问题: