MongoDB+;Express如何优化代码?
大家好,我有这个坏代码,我如何才能优化它 如果我使用SQL,我可以在一个查询中使用内部查询 “用户”这是猫鼬的唯一对象MongoDB+;Express如何优化代码?,mongodb,express,Mongodb,Express,大家好,我有这个坏代码,我如何才能优化它 如果我使用SQL,我可以在一个查询中使用内部查询 “用户”这是猫鼬的唯一对象 getProfile: async (req, res) => { const { id } = req.params; try { const { image, name, gender,
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()。如果您想知道那里实际发生了什么,请查看您需要的是什么