2015-05-08 41 views
9

最近我深入MongoDB,我想知道存储的JavaScript程序。在阅读PointBeing的Blog Entry后,我收到了一些问题。MongoDB是否更快存储JavaScript过程?

  • 将我的代码存储在数据库中真的有优势吗?我的意思是像lookups for documents这样的函数,而不是像PointBeing的例子那样的adding numbers
  • 从Node.js Side访问JavaScript代码是否更快?
  • 如果我的查询存储在数据库中,缓存(并更快)?

我在从node.js开发的角度看。

+2

每个帖子保留一个问题。 SO不允许同时提出4个问题。 –

+3

@Salvador这些问题都是密切相关的,我没有把它们分成三个独立的帖子。 – deceze

+1

1:不,2:不,3:当然不是 – Sammaye

回答

13

评估存储在db.system.js(“存储过程”,当你想打电话给他们),不推荐使用的功能。 db.eval shell functionthe 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文档。

+0

当查询涉及MongoDB Collections之间的许多准连接时,使用MongoDB C#Driver Version 1.7.0.4714 API实现查询非常困难。如果您将大量来自MongoDB世界的数据作为列表中的POCO对象引入C#世界,我认为它会降低性能。所以,我在考虑采用使用C#在MongoDB中调用存储的JavaScript的实现实践是否会很好。你说的调用Stored JavaScript是不好的。请参阅:http://stackoverflow.com/questions/36220272/c-sharp-invocation-of-stored-javascript-in-mongodb-vs-mongodb-c-sharp-driver-ver –

+0

@ CSLewis当你需要做很多准连接,那么很可能你正在使用像关系数据库那样的mongodb,这很少能为你带来好的结果。 – Philipp

+0

好的,但是,如果我只是对含有大量数据的集合进行大量的分析,该怎么办?我认为这会导致C#世界中的C#POCO对象收集大量文档,从而导致性能下降。相反,我认为如果C#调用Stored JavaScript来做更多的密集分析,然后将最终结果返回给C#世界会更好。我还有什么其他的选择? –

3

有趣的是,当JS只使用单线程全局锁定时,写博客文章(http://pointbeing.net/weblog/2010/08/getting-started-with-stored-procedures-in-mongodb.html)。

这意味着没有与之相关的控制货币功能或更细化的锁定(锁定仍然是一个问题,并且只能通过多个分离物实现同一货币)。仅仅因为你在一些随机的博客文章中看到它并不意味着它应该被使用。

直接回答你的问题:

  1. 都能跟得上。实际上缺点是主叫用户需要完整的管理权限。这意味着你为Web用户提供了每一个特权,因为内置的JS enigne具有所有功能的挂钩,包括管理功能,因此它需要管理员权限才能运行。

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

  3. 不,MongoDB缓存不能像那样工作。我建议你阅读基本面文档:http://docs.mongodb.org/manual/faq/fundamentals/