Javascript 在Keystone.js中查询并映射来自具有mongoose的父级的单向引用子级和子级

Javascript 在Keystone.js中查询并映射来自具有mongoose的父级的单向引用子级和子级,javascript,node.js,mongodb,mongoose,keystonejs,Javascript,Node.js,Mongodb,Mongoose,Keystonejs,我有三个模型,一对多的关系。简单的树。我需要的是一种简单、高效的查询结构化关系树的方法,最好类似于mongoose的.populate(),我不能使用它,因为我在父模型上没有id。我认为将子ID保留在父ID上会很有效,但Keystone默认情况下不提供此功能,并且我无法编写更新回调来控制关系更改。我试过了,浪费了太多的时间,发现自己误入歧途了,也许我想要实现的目标要容易得多,但我就是看不到 以下是代码: 类别模型 节模型,类别的子级 文章模型,章节的子项 我想获得一个包含所有子类及其各自子类的类

我有三个模型,一对多的关系。简单的树。我需要的是一种简单、高效的查询结构化关系树的方法,最好类似于mongoose的.populate(),我不能使用它,因为我在父模型上没有id。我认为将子ID保留在父ID上会很有效,但Keystone默认情况下不提供此功能,并且我无法编写更新回调来控制关系更改。我试过了,浪费了太多的时间,发现自己误入歧途了,也许我想要实现的目标要容易得多,但我就是看不到

以下是代码:

类别模型 节模型,类别的子级 文章模型,章节的子项 我想获得一个包含所有子类及其各自子类的类别的结构化视图,如下所示:

[ { _id: 57483c6bad451a1f293486a0,
    name: 'Test Category',
    sections: [
        { _id: 57483cbbad451a1f293486a1,
        name: 'Test Section',
        articles: [ 
            { _id: 57483c6bad451a1f293486a0,
             name: 'Test Category' } 
        ]
    ]
} ]

我就是这样做的。一点效率都没有,但至少它在工作。我没有把任何东西放在一级家长中,因为我只需要一个

// Load current category
view.on('init', function (next) {

    var q = keystone.list('Category').model.findOne({
        key: locals.filters.category
    });

    q.exec(function (err, result) {

        if (err || !results.length) {
            return next(err);
        }

        locals.data.category = result;
        locals.section = locals.data.category.name.toLowerCase();           
        next(err);
    });

});


// Load sections and articles inside of them
view.on('init', function (next) {
    var q = keystone.list('Section').model.find().where('category').in([locals.data.category]).sort('sortOrder').exec(function(err, results) {

        if (err || !results.length) {
            return next(err);
        }

        async.each(results, function(section, next) {
            keystone.list('Article').model.find().where('section').in([section.id]).sort('sortOrder').exec(function(err, articles){
                var s = section;
                if (articles.length) {
                    s.articles = articles;
                    locals.data.sections.push(s);
                } else {
                    locals.data.sections.push(s);
                }
            });             

        }, function(err) {
            next(err);
        });

        next(err);
    });
});
但现在我又遇到了另一个问题。我使用Jade 1.11.0作为模板,有时它不会在视图中显示数据。
我将为本期发布另一个问题。

我就是这样做的。一点效率都没有,但至少它在工作。我没有把任何东西放在一级家长中,因为我只需要一个

// Load current category
view.on('init', function (next) {

    var q = keystone.list('Category').model.findOne({
        key: locals.filters.category
    });

    q.exec(function (err, result) {

        if (err || !results.length) {
            return next(err);
        }

        locals.data.category = result;
        locals.section = locals.data.category.name.toLowerCase();           
        next(err);
    });

});


// Load sections and articles inside of them
view.on('init', function (next) {
    var q = keystone.list('Section').model.find().where('category').in([locals.data.category]).sort('sortOrder').exec(function(err, results) {

        if (err || !results.length) {
            return next(err);
        }

        async.each(results, function(section, next) {
            keystone.list('Article').model.find().where('section').in([section.id]).sort('sortOrder').exec(function(err, articles){
                var s = section;
                if (articles.length) {
                    s.articles = articles;
                    locals.data.sections.push(s);
                } else {
                    locals.data.sections.push(s);
                }
            });             

        }, function(err) {
            next(err);
        });

        next(err);
    });
});
但现在我又遇到了另一个问题。我使用Jade 1.11.0作为模板,有时它不会在视图中显示数据。
我将针对这个问题发布另一个问题。

好吧,我发现next()过早触发的错误。我在另一个问题中修复了这段代码:好吧,我发现了next()过早触发的错误。我在另一个问题中修复了这段代码:
[ { _id: 57483c6bad451a1f293486a0,
    name: 'Test Category',
    sections: [
        { _id: 57483cbbad451a1f293486a1,
        name: 'Test Section',
        articles: [ 
            { _id: 57483c6bad451a1f293486a0,
             name: 'Test Category' } 
        ]
    ]
} ]
// Load current category
view.on('init', function (next) {

    var q = keystone.list('Category').model.findOne({
        key: locals.filters.category
    });

    q.exec(function (err, result) {

        if (err || !results.length) {
            return next(err);
        }

        locals.data.category = result;
        locals.section = locals.data.category.name.toLowerCase();           
        next(err);
    });

});


// Load sections and articles inside of them
view.on('init', function (next) {
    var q = keystone.list('Section').model.find().where('category').in([locals.data.category]).sort('sortOrder').exec(function(err, results) {

        if (err || !results.length) {
            return next(err);
        }

        async.each(results, function(section, next) {
            keystone.list('Article').model.find().where('section').in([section.id]).sort('sortOrder').exec(function(err, articles){
                var s = section;
                if (articles.length) {
                    s.articles = articles;
                    locals.data.sections.push(s);
                } else {
                    locals.data.sections.push(s);
                }
            });             

        }, function(err) {
            next(err);
        });

        next(err);
    });
});