MongoDB文檔中欄位是否有先後順序之分?
在這片文章中,簡單談談關於Mongodb中欄位先後順序的問題。Mongodb中的文檔是一種Key:Value對組成的Json字串,按理說,欄位的先後順序是不應該影響到查詢操作的。
我們簡單做個實驗,往集合中插入一條記錄:
db.testcollection.insert({"apple":2, "banana":3});
這時候,我們通過以下兩種方式查詢都是一樣的:
第一種方式:
db.testcollection.find({"apple":2,"banana":3})
第二種方式:
db.testcollection.find({"banana":3,"apple":2})
通過上面兩種方式查詢都可以查詢出來結果,都是同一條記錄。那是否就可以說明,欄位順序是沒有區別的呢?別著急,我們再看一個例子。
比方我們在集合中插入了下面一條記錄:
db.testcollection.insert({"type":"fruit", "detail":{"apple":2, "banana":3}});
此時我們和上面一樣,採用兩種方式進行查詢:
第一種方式:
db.testcollection.find({"detail":{"apple":2,"banana":3}})
第二種方式:
db.testcollection.find({"detail":{"banana":3,"apple":2}})
從兩種查詢方式的結果來看,其實結果是不一樣的,第一種方式查詢到了結果,但是第二種方式是沒有查詢到結果的。從這個執行個體來看,就可以告訴我們,當我們在查詢具有嵌套文檔的集合中,還是要稍微注意一點的,否則很有可能就會出現上面的情況。
我們如何避免出現上面這樣因為書寫順序而導致的查詢結果不一樣的情況呢?有個辦法,那就是在查詢時不要使用json字串進行查詢,在這種具有嵌套文檔的集合中,可以使用點符號進行操作,我們採用下面兩種方式進行查詢。
第一種方式:
db.testcollection.find({"detail.apple":2,"detail.banana":3})
第二種方式:
db.testcollection.find({"detail.banana":3,"detail.apple":2})
通過結果可以知道,這兩種方式查詢出來的結果是一樣的,由此可見,不管是對於簡單的查詢,還是對於具有嵌套文檔的查詢,不在查詢字串中對欄位值使用Json串書寫格式,而是使用點號進行嵌套引用查詢才是比較合適的做法,可以防止因書寫欄位順序和文檔中的欄位順序不一樣導致的查詢錯誤。
更多MongoDB相關教程見以下內容:
CentOS 編譯安裝 MongoDB與mongoDB的php擴充
CentOS 6 使用 yum 安裝MongoDB及伺服器端配置
Ubuntu 13.04下安裝MongoDB2.4.3
MongoDB入門必讀(概念與實戰並重)
Ubunu 14.04下MongoDB的安裝指南
《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]
Nagios監控MongoDB分區叢集服務實戰
基於CentOS 6.5作業系統搭建MongoDB服務
MongoDB 的詳細介紹:請點這裡
MongoDB 的:請點這裡
本文永久更新連結地址: