node js如何将两个集合数据分配到单个对象中以在视图上呈现

时间:2017-05-10 10:15:15

标签: node.js express mongoose ejs

我为自己的做法创建了一个简单的新闻文章应用程序。所以我在mongoose中创建了两个模式 现在我尝试从这些集合中检索数据并尝试将这些值分配到单个对象中 我尝试这么多次并搜索了很多地方,但仍然无法在节点js中找到更好的解决方案。

这是我的获取路由器在视图上显示数据:

app.get('/admin-area345', function(req, res){
    articles.find({}, function(err, data){
        if(err) throw err;
        for (var i = 0; i < data.length; i++) {
            categories.findById(data[i].cat_id).then(function(cates){
                data[i]['cat_name'] = cates.catName;
                console.log(data);
                res.render('pages/admin/index', {
                    arts: data
                });
            });
        }
    });
}); 

这是我的类别模型架构:

const catSchema = Schema({
    catName: {
        type: String
    }
});

这是我的文章架构:

const artSchema = Schema({
    title: {
        type: String
    },
    body: {
        type: String
    },
    author: {
        type: String
    },
    cat_id: {
        type: String
    },
    date: {
        type: Date,
        default: Date.now
    }
});

最后,这是显示从mongoose集合中检索的数据的视图页面。为此,我使用EJS模板作为我的视图引擎。

<%if(typeof(arts) != 'undefined'){%>
<div class="articles">
<%for(var i = 0; i < arts.length; i++){%>
    <h2><%=arts[i].title%> | <small><%=arts[i].cat_name%></small></h2>
    <p><%=arts[i].body%></p>
    <p>Added date - <%=arts[i].date%></p>
    <small>Added By - <%=arts[i].author%></small></br>
    <a href="/admin-area345/adminupdateart">Update Article</a></br>
    <a href="/admin-area345/admindelart">Delete Article</a></br>
<%}%>
</div>
<%}%>

我希望你们能给我一个更好的答案,轻松地做到这一点。

1 个答案:

答案 0 :(得分:2)

你应该使用聚合进行查询,然后很容易就可以修改你的对象。所以试试这个:: 当我们使用find查询从mongodb检索数据时,我们无法更新或更改object.so使用aggregate而不是find()。

app.get('/admin-area345', function(req, res){
    articles.aggregate([{'$match':{}]).exec(function(err, data){
        if(err) throw err;
        for (var i = 0; i < data.length; i++) {
            categories.findById(data[i].cat_id).then(function(cates){
                data[i]['cat_name'] = cates.catName;
                console.log(data);
                res.render('pages/admin/index', {
                    arts: data
                });
            });
        }
    });
});