我想提出的問題是,mongodb既然是一個麵向文檔的數據庫,而且它的存儲格式又是與json如此類似的bson。如此寬鬆的使用環境,那麼為什麼不把步子放更大一點,而對每個字段都要有類型約束呢。比如下麵的數據結構
{ 'field_1': 1, 'field_2': '1', 'field_3': true }
在腳本語言裏,這三個值是相等的,但mongodb可不這樣認為,如果你用string
類型去尋找field_1
的值,那麼永遠找不到。
可是像在php這種弱類型語言裏,本來就是string,int傻傻分不清楚,所以使用mongodb的php程序員經常會出現以下杯具場景,你存儲的時候主鍵是一個用函數生成的int
型數字,但取出記錄的時候可能直接使用前端傳遞過來的GET參數,很不巧它隻能是一個string類型,這樣你就永遠找不到這條記錄了。
諸如此類的事情還很多,我在想既然mongodb不對數據結構做約束,為什麼不幹脆連數據類型也不做約束呢?因為既然不約束結構,那麼程序中就無法對應出類型,這樣也不好做強製類型轉換之類的。你們有什麼看法嗎?
檢索效率是和儲存方式是永遠沒辦法規避的,三種類型的儲存位元組長度決定了其查詢和計算的效率是不可能一致的,nosql再怎麼優化也只是在策略層面,畢竟儲存層更多看的是介質本身的效能。
MongoDB不是只提供給PHP這種語言使用的。
也許算是C語言的原因吧,沒有資料結構,是因為用文件試存儲,用的bson,但是具體的資料類型,C語言還是有嚴格限制的,不像php的若資料類型語言
The Zen of Python 裡面有兩句 (可以在python cli 中呼叫 import this 查看):
第一句可以解釋mongodb 的 的強型別
第二句可以解釋mongodb 的 schema-less
python 就是這樣的。動態語言,但是需要顯示的型別轉換。這是一種更嚴謹的工作方式。
用php 的 driver 的確會遇到這種問題,只能在查詢時手動處理了。