【问题标题】:MongoDB + Express How to Optimize the code?MongoDB + Express 如何优化代码?
【发布时间】: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);
        }

    }


【问题讨论】:

标签: mongodb express


【解决方案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
猜你喜欢
  • 2022-11-23
  • 2015-09-19
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
相关资源
最近更新 更多