最近我深入MongoDB,我想知道存储的JavaScript程序。从PointBeing阅读Blog Entry后,我收到了一些问题。
lookups for documents
这样的函数,而不是像PointBeing那样的adding numbers
函数。我从node.js开发的角度看。
答案 0 :(得分:16)
不推荐使用db.system.js中存储的函数("存储过程",当你想要调用它们时)。 db.eval shell function和the eval database command上的文章有一个"自3.0版以来已弃用"警告和the article on server-sided javascript不再提及。所以你应该避免使用它。一个原因是您在使用分片时无法运行javascript函数。因此,当您构建需要eval的应用程序时,可以防止它在将来扩展。另一个是javascript函数破坏了权限概念。它们总是需要以管理员身份运行,这使得无法建立一个理智的权限系统。考虑到使用用户提供的数据的服务器端脚本可能容易受到任意脚本注入的攻击,从安全角度来看这尤其成问题。
服务器端javascript的优点是它可以在数据库服务器上运行。当您需要执行大量查询时,这可以减少应用程序服务器和数据库服务器之间的延迟。但是,您可以通过在数据库服务器上打开mongo shell并在那里执行它来获得相同的优势。
延迟优势仅在您从脚本执行多个查询时才有意义。如果只有一个查询,则在调用脚本时仍会有延迟。所以除了不必要的复杂性之外你什么也得不到。
服务器端javascript没有额外的缓存或其他优化。更糟糕的是:每次运行它都会得到重新解释和重新解释。因此,它甚至可能比您的应用程序服务器中的javascript慢。
此外,许多需要脚本支持仅使用find()
实现的复杂查询通常可以使用aggregation表示,这在大多数情况下会比使用find()
更快地表达和javascript,因为聚合框架是用C ++实现的,可以访问原始的BSON文档。
答案 1 :(得分:3)
热闹的是,当JS只采用单线程全局锁时,写了博客文章(http://pointbeing.net/weblog/2010/08/getting-started-with-stored-procedures-in-mongodb.html)。
这意味着没有con-currency功能或更多与之关联的粒度锁(锁仍然是一个问题,并且只能通过多个隔离来实现con-currency)。仅仅因为你在一些随机博客文章中看到它并不意味着它应该被使用。
直接回答您的问题:
不。实际上,缺点是主叫用户需要完全的管理权限。这意味着您为Web用户提供了每个权限,因为内置的JS enigne具有所有内容的挂钩,包括管理功能,因此需要管理员权限才能运行。
在JS中将JS从JS调用到JS到C ++?否
不,MongoDB缓存不起作用。我建议您阅读基础知识文档:http://docs.mongodb.org/manual/faq/fundamentals/