猫鼬因"findById"和".save"而缩短时间



我有这个方法来编辑我的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 })
}
});

相关内容

  • 没有找到相关文章

最新更新