2015-05-08 42 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/