评估存储在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文档。
每个帖子保留一个问题。 SO不允许同时提出4个问题。 –
@Salvador这些问题都是密切相关的,我没有把它们分成三个独立的帖子。 – deceze
1:不,2:不,3:当然不是 – Sammaye