MongoDB 存储 JavaScript 过程是否更快?

Are MongoDB Stored JavaScript Procedures faster?

我对存储的 JavaScript 过程有疑问。看完PointBeing的Blog Entry,我有一些疑问。

我对 MongoDB 存储的 javascript 性能与 Node.js Javascript 相比感兴趣。

搞笑的是博客post(http://pointbeing.net/weblog/2010/08/getting-started-with-stored-procedures-in-mongodb.html)是在JS只拿单线程全局锁的时候写的。

这意味着没有并发特性或与之相关的更细粒度的锁(锁仍然是一个问题,并发仍然只能通过多个隔离来实现)。仅仅因为您在某个随机博客中看到它 post 并不意味着应该使用它。

直接回答您的问题:

  1. 没有。事实上,缺点是调用用户需要完全的管理员权限。这意味着您将每一项权限都授予您的网络用户,因为内置的 JS enigne 具有所有内容的挂钩,包括管理功能,因此它需要管理员权限才能 运行.

  2. 在JS中从JS调用JS到JS再到C++?否

  3. 不,MongoDB 缓存不是那样工作的。我建议您阅读基础文档:http://docs.mongodb.org/manual/faq/fundamentals/

评估存储在 db.system.js 中的函数("Stored procedures",当你想调用它们时)已被弃用。 db.eval shell function and the eval database command have a "Deprecated since version 3.0" warning and the article on server-sided javascript上的文章就不再提了。所以你应该避免使用它。一个原因是当你使用分片时你不能 运行 一个 javascript 函数。因此,当您构建需要 eval 的应用程序时,您可以防止它在未来扩展。另一个是 javascript 函数破坏了权限概念。他们总是需要 运行 作为管理员,这使得无法建立健全的权限系统。考虑到使用用户提供的数据的服务器端脚本可能容易受到任意脚本注入的攻击,从安全的角度来看,这尤其成问题。

服务器端javascript的优点是它运行在数据库服务器上。当您需要执行大量查询时,这会减少应用程序服务器和数据库服务器之间的延迟。但是您可以通过在数据库服务器上打开 mongo shell 并在那里执行它来获得相同的优势。

仅当您从脚本执行多个查询时,延迟优势才有意义。当您只有一个查询时,调用脚本时仍然会有延迟。因此,除了不必要的复杂性之外,您一无所获。

服务器端没有额外的缓存或其他优化javascript。更糟糕的是:每次你 运行 它都会被重新解析和重新解释。所以它甚至可能比您的应用程序服务器中的 javascript 慢。

此外,许多需要脚本支持才能实现的复杂查询通常可以使用 aggregation 来表达,这在大多数情况下比使用 [=10] 快得多=] 和 javascript 因为聚合框架是用 C++ 实现的,并且可以访问原始 BSON 文档。