Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB+;Express如何优化代码?_Mongodb_Express - Fatal编程技术网

MongoDB+;Express如何优化代码?

MongoDB+;Express如何优化代码?,mongodb,express,Mongodb,Express,大家好,我有这个坏代码,我如何才能优化它 如果我使用SQL,我可以在一个查询中使用内部查询 “用户”这是猫鼬的唯一对象 getProfile: async (req, res) => { const { id } = req.params; try { const { image, name, gender,

大家好,我有这个坏代码,我如何才能优化它

如果我使用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);
        }

    }
附言。 我只学习这种技术

如果我使用了来自用户的查询结果的spread运算符,我的结果如下:

这就是我得到的结果

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

    }



您可以在用户模型中嵌入订阅[array of documents]。但请记住,如果订阅可能被访问,而不管其用户是谁,那么这可能会对您的api造成限制

因为您的所有查询都是独立的,所以我们所能做的就是使用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);
    }
}

希望这有帮助:)

你能给我一个链接,我可以在那里读到这篇文章吗?或者链接示例。有很多关于NoSql DBs的书籍,我建议您首先看一下这本:,阅读第2章关于如何聚合数据并将其作为一个单元进行处理。谢谢您的回答)谢谢,我将尝试这样做…:)您的解决方案几乎可以帮助我解决一个问题,即当我使用带有userData的spread运算符时。。我在上面的问题中附上了一张图片,很高兴它对您有所帮助。对于您提到的另一个问题,请尝试将…userData更改为…userData.toObject()。如果您想知道那里实际发生了什么,请查看您需要的是什么