MongoDB + Express Как оптимизировать код? - PullRequest
1 голос
/ 21 января 2020

Привет всем, у меня есть этот плохой код для меня, как я могу его оптимизировать?

Если я использовал SQL, я могу сделать используемые внутренние запросы в одном запросе ...

"Пользователь "это всего лишь объект из пн goose

  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. Я только учусь с этими технологиями

Если бы я использовал оператор спреда результата моего запроса от пользователя, у меня было бы так: enter image description here

И то, что у меня есть в результат

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);
        }

    }


Ответы [ 2 ]

1 голос
/ 21 января 2020

Поскольку все ваши запросы независимы, лучшее, что мы можем сделать, это выполнить все их параллельно с 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);
    }
}

Надеюсь, это поможет:)

1 голос
/ 21 января 2020

Вы можете встраивать подписки [массив документов] в модель User. Но имейте в виду, что это может наложить ограничения на ваш API, если подписки могут быть доступны независимо от пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...