javascript - 服务器端 javascript 函数在 mongoDB 中是否存在性能问题?

标签 javascript function mongodb

在 MongoDB 中运行服务器端 JavaScript 是否存在性能问题? V8 是否解决了上述性能问题?

为什么 MongoDB documentation建议不要使用服务器端功能?

最佳答案

当您询问服务器端 javascript 的可行性时,您首先必须弄清楚您在谈论的是哪种服务器端 javascript。根据the documentation ,有四种不同的服务器端代码执行。不幸的是,对于 native API 不足的情况,它们都是一种骇人听闻的解决方法:

eval命令

eval 的缺点是它只能在一个节点上运行。这大大降低了它在集群环境中的实用性。对于分片集合,它根本不起作用!

默认情况下,它还会创建一个全局锁,使数据库在脚本运行之前完全无法使用。这可以通过 nolock 参数来防止(除非脚本本身做了一些创建全局锁的事情)。

Sammaye 的回答也解释了一些严重的安全问题。

它实际上更像是一个测试和管理工具,而不是您应该用于任何常规操作的工具。

通过服务器上的 mongo shell 实例运行 .js 文件

在这种情况下,代码不是在数据库上执行,而是在其中一台服务器上的另一个独立进程上执行。这意味着来自其他分片的所有必需数据都必须传输到运行 javascript 代码的服务器,无论脚本实际返回什么。

它作为 mongodb 服务器的另一个应用程序出现,因此它不能做您在常规应用程序中也不能做的任何事情。这是您不应在常规操作中使用的另一种测试和管理工具。

$where查找-运营商

查找命令中的 $where 运算符允许传递用于过滤值的 javascript 函数。对于大多数微不足道的情况,这比查找查询的其他工具必须提供的性能要低得多,尤其是因为它不能使用任何索引。

当无法避免使用 $where 时,至少尝试使用 find-query 的一些常规工具来减少需要传递给 $where 函数的文档集。

MapReduce

MapReduce 使用两个 javascript 函数来创建聚合数据。它曾经是 MongoDB 的主要数据挖掘工具,但它的大部分常用用例现在都由更加用户友好的 aggregation framework 来实现。 .

它也有与 $where 相同的缺点:除非你过滤,否则你必须为每个文档运行至少两个 javascript 函数而不是一个。

但 MapReduce 至少可以分布式运行并且可以并行化。

tl;博士:

对于非常不寻常的查询,使用 Javascript 是最后的手段,这些查询无法使用普通查询语言进行,并且需要访问太多数据才能在应用程序中实现。如果可能,请使用可用的专用工具执行您想执行的操作或在应用程序层上实现您的逻辑。

关于javascript - 服务器端 javascript 函数在 mongoDB 中是否存在性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17550244/

相关文章:

c++ - 模板函数的简单脚本引擎模板数据类型

mongodb - 如何从 1 分钟嵌套数组数据(mongodb、 Mongoose )聚合 OHLC 5 分钟

javascript - 修饰符无效,修饰符必须是对象错误

javascript - 从时间戳的 API 返回中获取用户年龄

javascript - 如何使用 PHP 将局部变量调用到另一个函数中

javascript - 如何使用 AngularJS 输出 JSON 数组中的元素

function - gitlab ci 脚本功能失败时屏蔽 exit 1

spring - spring-data-mongo 文档中的计算字段

javascript - 使用数据属性在值之前显示货币符号

javascript - Laravel 使用 webpack mix 导入 javascript 自定义文件