use*_*821 4 javascript function mongodb
在MongoDB中运行服务器端JavaScript是否存在性能问题?V8能解决上述性能问题吗?
为什么MongoDB文档建议不使用服务器端功能?
当你询问服务器端javascript的可行性时,首先要弄清楚你在谈论什么样的服务器端javascript.根据文档,有四种不同的服务器端代码执行.不幸的是,对于本机API不足的情况,它们都是一种hackish变种:
eval的缺点是它只能在一个节点上运行.这大大降低了它在集群环境中的实用性.使用分片集合,它根本不起作用!
默认情况下,它还会创建一个全局锁,这使得数据库在脚本运行之前完全无法使用.这可以通过nolock参数来防止(除非脚本本身执行创建全局锁定的操作).
Sammaye的答案也解释了一些严重的安全问题.
它实际上是一个测试和管理工具,而不是你应该用于任何常规操作的东西.
在这种情况下,代码不会在数据库上执行,而是在其中一个服务器上执行另一个独立进程.这意味着必须将来自其他分片的所有必需数据传输到运行javascript代码的服务器,无论脚本实际返回什么.
它似乎是mongodb服务器的另一个应用程序,因此它无法在常规应用程序中执行任何操作.它是另一种不应在常规操作中使用的测试和管理工具.
find-command中的$ where运算符允许传递用于过滤值的javascript函数.对于大多数琐碎的情况,这比查找查询的其他工具所提供的要低得多,特别是因为它不能使用任何索引.
当$ where的使用无法避免时,至少尝试使用find-query的一些常规工具来减少需要传递给$ where函数的文档集.
MapReduce使用两个javascript函数来创建聚合数据.它曾经是MongoDB的主要数据挖掘工具,但它的大多数常用用例现在都由更加用户友好的聚合框架来实现.
它也有与$ where相同的缺点:除非你过滤,否则你必须为每个文档运行一个但不至少两个javascript函数.
但MapReduce至少可以运行分布式并且可以并行化.
对于非常不寻常的查询,使用Javascript是最后的手段,这些查询无法使用普通查询语言进行,并且需要访问要在应用程序中实现的太多数据.如果可能,使用您可用的专用工具执行您想要的操作,或在应用程序层上实现您的逻辑.
文档中建议不要在 MongoDB 中使用存储的 JavaScript 过程。
我仍然拒绝将其称为“服务器端”,因为这表明它可以“在”MongoDB 中工作,但事实并非如此,它们不是存储过程。
无论如何,默认情况下 JavaScript 函数采用全局锁定,这可以通过nolockV8(自 2.4 起默认)可以多线程来缓解;所以看起来这确实可用,但还有其他问题:
老实说,V8 的更改为 MapReduce 等内容增添了一些令人惊叹的功能,但我不会说它在尝试用存储的 JavaScript 函数替换存储过程方面发生了很大变化。
作为补充说明:http://docs.mongodb.org/manual/reference/command/eval/#dbcmd.eval那里的警告框应该让您远离尝试此操作。