写给MongoDB开发者的50条建议Tip11
本系列文章翻譯自《50 Tips and Tricks for MongoDB Developers》,暫時沒有找到中文版,反正自己最近也在深入學(xué)習(xí)mongodb,所以正好拿來翻譯一下。一方面加強自己學(xué)習(xí)的效果,另一方面讓大 家也一起來體驗一下需要我們這些mongodb使用者需要注意的地方。
首先聲明自己的英文水平不是太高,加之有些英文翻譯成中文也找不到合適的詞來表達,所以在文章中可能會出現(xiàn)英文原詞,或者說有些地方的翻譯會有些生 硬,也就是說會出現(xiàn)直譯的地方。翻譯該書的主要目的是為大家學(xué)習(xí)探討用的,如果有翻譯不精準的地方,或者說有更加精準的翻譯,還請大家指出,我會及時的更 正的,在此先謝過各位了。
Tip11.Prefer $-operators to JavaScript
使用$操作符,而不是用javascript
對于大多數(shù)應(yīng)用,設(shè)計一個自包含的文檔,可以將查詢的復(fù)雜性降到最低。但是,有的時候你需要查詢的內(nèi)容用$操作符沒有辦法做到。這時候,可以使用javascript。你可以使用$where,在查詢中執(zhí)行任意的javascript代碼。
為了使用$where,你需要寫一個javascript函數(shù),返回值是true或者false。假設(shè)你需要返回member[0].value等于member[1].value的記錄,你可以這么做。
只要你想到的,$where可以賦予你的查詢更強的能力。
$where需要花費很長的時間,因為mongodb需要在幕后做很多工作。當(dāng)你執(zhí)行一個正常的(非$where)查詢,客戶端把查詢轉(zhuǎn)換成BSON,然后發(fā)送給數(shù)據(jù)庫。mongodb存儲數(shù)據(jù)也是用BSON,因此可以用條件進行基本的比較。這非常快,而且高效。
現(xiàn)在假設(shè)在查詢時候需要使用$where。mongodb必須為集合中的每一個文檔創(chuàng)建一個javascript對象,解析文檔的BSON,然后將字段賦值到j(luò)avascript對象中。然后執(zhí)行你發(fā)送過去的javascript代碼,進行比較,然后再拆解這些對象。這相當(dāng)耗時,而且需要很多資源。
$where在必要的時候是一個好的選擇,但是要避免任何時候都是用。事實上,如果在查詢中發(fā)現(xiàn)很多$where,這時候就需要重新考慮你的文檔結(jié)構(gòu)了。
如果非要使用$where,你可以想一些辦法,減少使用$where的文檔數(shù)量。先用條件過濾,然后對過濾后的文檔使用$where,$where就不會花很長時間了。
例如,我們在上面的場景使用$where,我們需要檢查member的age,我們只需要檢查相關(guān)的成員和家庭成員。
?
?
現(xiàn)在,所有非joint和family的member就不用花時間執(zhí)行$where了。
?
本文轉(zhuǎn)自 virusswb 51CTO博客,原文鏈接:http://blog.51cto.com/virusswb/799456,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的写给MongoDB开发者的50条建议Tip11的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux启动系统不显示进度条设置方法
- 下一篇: shell 与 空格