MongoDB + Express ???????

Posted

技术标签:

【中文标题】MongoDB + Express 如何优化代码?【英文标题】:MongoDB + Express How to Optimize the code? 【发布时间】:2020-05-07 13:28:03 【问题描述】:

大家好,我有这个糟糕的代码,我该如何优化它?

如果我使用 SQL,我可以在一个查询中使用内部查询...

“用户”它是来自猫鼬的唯一对象

  getProfile: async (req, res) => 
        const  id  = req.params;

        try 
            const 
                image,
                name,
                gender,
                about,
                email,
                phone,
                address
             = await User.findById( _id: id ).select('image name gender about email phone address');

            const subscriptions = await Subscriber.countDocuments( userId: id );
            const subscribers   = await Subscriber.countDocuments( subscriberId: id );

            const user = 
                image,
                name,
                gender,
                subscriptions,
                subscribers,
                about,
                email,
                phone,
                address
            ;

            res.json(user);

         catch (err) 
            console.log(err);
        

    

PS。 我只研究这种技术

如果我使用来自用户的查询结果的扩展运算符,我会这样:

这就是我的结果

module.exports = 

    getProfile: async (req, res) => 
        const  id  = req.params;

        try 

            const [data, subscriptions, subscribers] = await Promise.all([
                User.findById(  _id: id ,
                    
                        __v: false,
                        password: false,
                        date: false,
                        _id: false
                    ,
                ),
                Subscriber.countDocuments( userId: id ),
                Subscriber.countDocuments( subscriberId: id )
            ])

            const user = 
                ...data._doc,
                subscriptions,
                subscribers
            

            res.json(user);

         catch (err) 
            console.log(err);
        

    


【问题讨论】:

你需要的是mongoose populate 【参考方案1】:

您可以在 User 模型中嵌入订阅 [文档数组]。但请记住,如果无论用户如何都可以访问订阅,这可能会对您的 api 施加限制。

【讨论】:

你能给我链接吗?或链接示例.. 关于NoSql DB的书很多,推荐先看看这本:martinfowler.com/books/nosql.html,阅读第2章如何聚合数据并作为一个单元处理. 感谢您的回答)【参考方案2】:

由于您的所有查询都是独立的,因此我们能做的最好的事情就是使用 Promise.all() 并行执行所有查询。试试这样的:

getProfile: async (req, res) => 
    const  id = _id  = req.params;
    try 
        const getUser = User.findById( _id ).select('image name gender about email phone address');
        const getSubscriptions = Subscriber.countDocuments( userId: id );
        const getSubscriber = Subscriber.countDocuments( subscriberId: id );

        const [userData, subscriptions, subscribers] = await Promise.all([getUser, getSubscriptions, getSubscriber]);
        const user = 
            ...userData,
            subscriptions,
            subscribers,
        ;
        res.json(user);
     catch (err) 
        console.log(err);
    

希望这会有所帮助:)

【讨论】:

谢谢,我会努力的... :) 您的解决方案几乎可以帮助我,但是当我使用带有 userData 的扩展运算符时出现了一个问题。我在上面的问题中附上了一张图片 很高兴它有帮助,对于您提到的其他问题,请尝试将 ...userData 更改为 ...userData.toObject() 如果您想知道那里实际发生了什么,看看this

以上是关于MongoDB + Express ???????的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB + Express ???????

Node.JS、Express 和 MongoDB :: 多个集合

重点突破—— Nodejs+Express+MongoDB的使用基础

MongoDB + Express 环境搭建记

Express4+Mongodb极简入门实例

如何填充递归模式引用 Mongodb、Mongoose、Express?