Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何返回Sequelize中树节点的子节点数?_Mysql_Sql_Node.js_Sequelize.js - Fatal编程技术网

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包来解决此问题: