gpt4 book ai didi

javascript - MongoDB采集方式和数据库命令有哪些性能差异

转载 作者:行者123 更新时间:2023-12-03 12:24:13 25 4
gpt4 key购买 nike

虽然帖子链接为here回答了根本的区别,两者之间有性能差异吗?如果我使用 MongoDB 后端,方法和命令之间的权衡是什么,或者它们真的可以互换(至少对于更新、插入、删除)?

最佳答案

一般情况下,这两种形式都是相对可以互换的。就像您引用的帖子中的答案解决了这样一个事实:您在 mongo shell 方法以及驱动程序实现中看到的是,提供的方法实际上只是底层命令方法的包装器,甚至类似于 db.runCommand其本身在某种程度上确实如此。

实际上,一切都只是将请求编码到 BSON 对象以在系统上处理的一种手段 $cmd收藏。唯一真正需要考虑的是实现,您可能认为这是开销,但无论如何您很可能确实应该做这些事情。

例如,您可以深入研究 .update() mongo shell 中的实现将显示“一些”包装代码。主要片段:

if (!wc)
wc = this.getWriteConcern();

if ( this.getMongo().writeMode() != "legacy" ) {
var bulk = this.initializeOrderedBulkOp();
var updateOp = bulk.find(query);

if (upsert) {
updateOp = updateOp.upsert();
}

if (multi) {
updateOp.update(obj);
}
else {
updateOp.updateOne(obj);
}

try {
result = bulk.execute(wc).toSingleResult();
}
catch( ex ) {
if ( ex instanceof BulkWriteError || ex instanceof WriteCommandError ) {
result = ex.toSingleResult();
}
else {
// Other exceptions thrown
throw ex;
}
}
}
else {
this._validateUpdateDoc(obj);
this.getMongo().update(this._fullName, query, obj,
upsert ? true : false, multi ? true : false );

// enforce write concern, if required
if (wc)
result = this.runCommand("getLastError", wc instanceof WriteConcern ? wc.toJSON() : wc);
}

这是来自 MongoDB 2.6 版本。您在这里可以看到的是,这个“助手”本质上试图将请求参数“包装”到新样式的“批量”操作中。尽管“单一”而不是批量,但此处的目的是利用提供的“写关注”响应。

考虑到性能,请求可以不带 "write concern"实现本质上显示在代码中的“遗留”实现中,并调用 "getLastError" .

这意味着调用本身本质上是“即发即忘”,虽然您可以显式设置此级别的“写入关注”,但对该方法的一般调用实际上并不等待请求本身。它是实现了“写入关注”级别的“getLastError”调用,它实际上“等待”请求处理并返回信息,例如“找到”、“修改”、“插入”或“删除”的内容”。

最终,您可以发出原始命令或执行自己的实现,但不考虑此类因素,而只是所有操作的快速“即发即忘”版本。但话虽这么说,这可能并不是您真正想要在应用程序中执行的操作,因为您要么想要提供的“耐用性”,要么只是通过将“写入关注”设置为“调整”耐用性到您所需的级别适合您的情况。

还包括所有常规“CRUD”操作,但“读取”或 .find() 除外,“批量”操作通过将多个请求合并为一个“在线”请求,为您提供最佳性能提升。这本身而不必等待每个单独操作的响应就是您将获得的最佳性能提升。因此,与单独使用“原始”命令相比,它确实看起来值得使用。

关于javascript - MongoDB采集方式和数据库命令有哪些性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24297160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com