虽然帖子链接here回答了根本区别,但两者之间是否有性能差异?如果我使用MongoDB后端,那么方法和命令之间的权衡是什么,或者它们是否真的可以互换(至少对于更新,插入,删除)?
答案 0 :(得分:1)
一般情况是任何一种形式都是相对可互换的。正如您在帖子中引用的答案所解释的那样,您在mongo shell方法和驱动程序实现中看到的事实是提供的方法实际上只是基础命令方法的包装,甚至类似于{{1}本身确实在某种程度上。
所以,实际上,一切都只是结束将请求编组到BSON对象中以便在系统db.runCommand
集合上处理的方法。唯一真正考虑的因素是你可能认为是开销,但你很可能真的应该做这些事情。
例如,您可以深入了解mongo shell中的$cmd
实现,它将显示“some”的包装代码。所以一个主要的片段:
.update()
这是来自MongoDB 2.6版本。你在这里看到的是这个“帮助器”本质上试图将请求参数“包装”到一个新的样式“批量”操作中。即使是“单数”而非批量,这里的意图是利用所提供的“写关注”响应。
考虑到性能,可以在没有"write concern"实现的情况下进行请求,这实现在代码中的“遗留”实现中显示"getLastError"。
这意味着调用本身实际上是“一劳永逸”,虽然您可以明确设置此级别的“写入问题”,但对方法的一般调用实际上并不等待请求本身。它是“getLastError”调用,其实现的“写入关注”级别实际上“等待”处理请求并返回诸如“已找到”,“已修改”,“已插入”或“已删除”等信息”
在一天结束时,您可以发出原始命令或执行您自己的实现,而不考虑这些事情,这只是您所有操作的快速“即发即弃”版本。但话说回来,这可能不是你想要在你的应用程序中做什么,因为你要么提供所提供的“耐用性”,要么只是通过将“写入关注”设置为“将”持久性“调整”到所需的级别。适合你的情况。
同样在所有一般“CRUD”操作方面,除了“Read”或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);
}
之外,“Bulk”操作通过将多个请求组合为一个“通过线路”,为您提供最佳性能提升“请求。这本身而不是等待每个单独操作的响应是您将获得的最佳性能提升。所以它确实看起来确实值得使用而不是“原始”命令。