我想提出的问题是,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 的確會遇到這種問題,只能在查詢時手動處理了。