2013-10-04 11 views
34

我聽說過MongoDB,但我不確定自己完全理解了這個概念。從數據庫中存儲和查詢JSON

如果我已經存儲在MongoDB的多個JSON對象:

[{"id": "peter", 
    "age": "12", 
    "gender": "male"}, 
{"id": "gemma", 
    "age": "12", 
    "gender": "female"}, 
{"id": "paul", 
    "age": "13", 
    "gender": "male"}] 

我怎麼能夠查詢所有JSON對象與age >= 12

回答

41

首先,瞭解JSON只是一種序列化技術。本身,這種序列化方法可能不應該確定你的持久性媒介。從表面上看你的問題,看起來你正在尋找的是一個典型的關係型存儲數據庫,你可以使用SQL以靈活的方式查詢你的數據。

地記錄或從這樣的關係型數據庫檢索後呈現序列化/反序列化JSON數據在幾乎任何編程語言是微不足道的。

現在,如果您真的需要存儲各種不具有固定結構的JSON文檔(或任何其他類型的文檔)的片段,那實際上當您通常會開始查看NoSQL類型的解決方案時作爲MongoDB。使用更流行的NoSQL數據庫的另一種可能情形是,當您處理大量數據並需要水平擴展時(即數據量太大時,需要將數據庫擴展到多個服務器上)。許多NoSQL系統比傳統的關係數據庫更容易做到這一點。當然,在這種情況下,您需要根據它們提供的功能來評估這些工具,以便以最有用的方式讀取,寫入和查詢數據以用於您的用例。

+0

謝謝麥克,我只是在爲研究項目存儲Facebook用戶對象做一些實地工作 - 水平伸縮是什麼意思? – Jakob

+3

@Jakob通過橫向擴展,我的意思是你處理這麼大的工作量,你需要多個節點/服務器來處理它。關係數據庫的水平縮放在歷史上比NoSQL文檔存儲更成問題。 –

5

如果所有的對象都具有相同的字段(ID,年齡,性別等),那麼你應該將對象存儲一些關係型數據庫(例如MySQL的)的行。

12

MongoDB以類似於JSON的BSON格式存儲數據。您可以使用JSON格式存儲數據,並可以在任何字段上進行查詢。您甚至可以在用於主要查詢的特定字段上編制索引。

您不限於MongoDB的,看到你的問題,我認爲任何文檔店將滿足您的需求。更多在這裏您閱讀: - http://en.wikipedia.org/wiki/Document-oriented_database

11

從5.7開始,MySQL的現在有本地JSON datatype。假設你的表稱爲students和JSON列名爲student,在MySQL 5.7您的選擇可以寫成

SELECT * FROM students WHERE JSON_EXTRACT(student, '$.age') = 12; 
+1

值得指出的是,這不僅僅是一個附帶邏輯的字符串。 MySQL以一種允許它快速獲取單個字段的方式存儲這些數據 - $ .age是一次獲取,它不需要解析原始的JSON來提取該值。 –

0

對於一個MongoDB的外殼查詢可能是這樣的:

db.people.find({"age": {gt:12 }});