評估存儲在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