首页 > 解决方案 > 有没有更好的方法在Nodejs中加入MongoDB中的两个集合

问题描述

我正在将nodejs与mongodb一起使用。
我们的团队目前正在构建一个简单的 android 社​​区应用程序。
由于我是服务器程序员,我想知道是否有更好的方法使用 mongodb 处理数据库。

在应用程序的应用程序图像

上图显示了我们的应用程序。
当用户点击一篇文章(左图)时,应用程序将移动到文章页面,其中包含文章的内容(右图的①标记)和文章的评论(右图的②标记)

我们成功地创建了这些应用程序。
但是有一个严重的问题:响应时间慢

应用程序通过每两个 POST API 带来数据。
一个是/selectBoardArticle加载文章的内容,另一个是/selectCommentList加载文章的全部评论。需要请求带文章的数据。

一些开发人员说两个请求导致了极长的响应时间。所以我正在尝试集成/selectBoardArticle/selectCommentList API。

我知道整合两个集合的数据的两种选择。
首先,使用 db.collection.aggregate 函数。
这是/selectBoardArticle API的源代码

app.post('/selectBoardArticle', util.session, function (req, res) {
TN_BBS.find({bbs_id: req.body.bbs_id, ntt_id: req.body.ntt_id, use_at: "Y"}).exec(function (err, result) {
    if (result.length) {
        //increase read count and save
        result[0].rdcnt++;
        result[0].save(function () {
            //join comment(TN_COMMENT) and image(TN_FILEDETAIL) data of the article
            TN_BBS.aggregate([{
                "$lookup": {
                    from: "TN_COMMENT",
                    localField: "ntt_id",
                    foreignField: "ntt_id",
                    as: "COMMENT"
                }
            }, {
                "$lookup": {
                    from: "TN_FILEDETAIL",
                    localField: "atch_file_id",
                    foreignField: "atch_file_id",
                    as: "TN_FILEDETAIL"
                }
            }, {
                "$match": {
                    ntt_id: req.body.ntt_id,
                    bbs_id: req.body.bbs_id
                }
            }]).limit(1).exec(function (err, result) {
                if (err) {
                    return res.send(err);
                }
                res.end(JSON.stringify(result[0]));
                setPopPoint(req.body.ntt_id);
            })
        });
    }
    else
        res.end("no result!");
}); 

二、找到每篇文章和评论数据,通过javascript将评论数据插入到文章数据中

router.get('/selectBoardArticles/:bbs_id', function (req, res) {
var query = {bbs_id: req.params.bbs_id, use_at: "Y"};
TN_BBS.find(query, function (err, doc) {
    if (err) {
        return res.send(err);
    }
    var ntt_ids = [];
    for (var i = 0; i < doc.length; i++) {
        ntt_ids.push(doc[i].ntt_id);
    }
    TN_COMMENT.find({bbs_id: req.params.bbs_id, ntt_id: {$in: ntt_ids}}, function (err, doc2) {
        for (var i = 0; i < doc.length; i++) {
            doc[i].comment = [];
            for (var j = 0; j < doc2.length; j++)
                if (doc2[j].ntt_id == doc[i].ntt_id) doc[i].comment.push(doc2[j]);
        }
        res.render('admin/board_articles', {data: doc, length: doc.length, boardMaster: req.params.bbs_id});
    });
});

虽然这个 API 返回文章列表,但我想说的概念是两次查找并通过 javascript 插入子数据。

我发现处理加入集合的问题很少。

第一个问题

我觉得不推荐使用 mongodb 作为关系数据库。

MongoDB 背后的想法是消除(或至少最小化)关系数据。 https://stackoverflow.com/a/8129650/5593805

如果我理解正确,我应该避免加入收藏。
但我找不到避免加入收藏的方法。
我应该将两个集合集成到一个集合中吗?
当有人经常在 mongodb 中使用聚合时,我认为使用关系数据库会更好。
我想知道您对此有何看法。

第二个问题

在 mongodb 中加入两个集合。
与关系数据库相比,我必须编写非常复杂的代码。更具体地说,mongodb需要非常长而复杂的join查询,可以在mysql中通过JOIN查询轻松直观地完成,不利于维护。
我想知道在nodejs中加入mongoDB中的两个集合有没有更好更有效的方法?

标签: node.jsmongodbjoinnosqlnosql-aggregation

解决方案


推荐阅读