我有这个方法来编辑我的mongodb图集数据库中的项目:
router.post("/edit", upload.single("image"), (req, res, next) => {
console.log("edit call: " + Date.now());
Schema.findById(req.body.editId, function (err, doc) {
if (err) {
console.error('error, no entry found');
}
if (req.file.path) {
console.log("before buffer create: " + Date.now());
doc.image = new Buffer(fs.readFileSync(req.file.path)).toString("base64");
console.log("after buffer create: " + Date.now());
}
doc.save((err) => {
console.log("saved: " + Date.now());
res.redirect('/admin');
}
);
})
});
输出:(数据库中只有1个文档(
edit call: 1622842404818
before buffer create: 1622842405819
after buffer create: 1622842405822
saved: 1622842406382
所以我的结论是:
- findById耗时1秒
- 节约需要500毫秒(我已经见过1500毫秒(
现在我想问是否有办法减少这段时间。如果数据库中有更多的项目,我担心会花费时间。
节省时间是否取决于base64字符串长度(有些图片会产生700k个字符串(?
实际上,最好的做法是将图像存储在一些存储中,并将该图像的URL放入MongoDB,而不是将实际图像放入MongoDB。
但是,如果您想继续使用这种方法,您可以使用findByIdAndUpdate
在一次调用中更新文档,而不是使用findById
获取文档并使用save()
保存。
router.post("/edit", upload.single("image"), async (req, res, next) => {
try {
await Schema.findByIdAndUpdate(req.body.editId, {
image = new Buffer(fs.readFileSync(req.file.path)).toString("base64")
});
console.log("saved: " + Date.now());
res.redirect('/admin');
} catch (error) {
res.status(400).json({ success: false, error })
}
});