Database-Design
MongoDB 如何處理混合類型?
我在搞亂 mongodb 並註意到我可以創建混合數據類型。
db.getSiblingDB("bermuda").getCollection("test").insertOne({ "profile": { "t1": 100 } }); db.getSiblingDB("bermuda").getCollection("test").insertOne({ "profile": { "t1": "test" } });
但因為
"t1": 100
是先寫的,DataGrip 認為這是一個 int 列。我可以通過兩種方式查詢這些結果。SELECT * FROM bermuda.test WHERE profile.t1 = 'test' ; SELECT * FROM bermuda.test WHERE profile.t1 = 100 ; SELECT * FROM bermuda.test WHERE profile.t1 > 0 ;
這提出了很多問題。
- Mongodb 是否認為這是 Int32、String、兩者或某種“Any”類型?
- 這對索引有何影響?
- 有沒有辦法獲得集合“模式”,或者只是查看該集合中的第一個文件?
模式驗證
您可以在集合中的文件上指定模式驗證,以驗證您可以為每個欄位插入或更新的數據類型。此外,您還可以設置其他約束,例如必填欄位。此功能將允許您維護欄位的特定數據類型。請注意,模式驗證是可選的。
欄位類型
預設情況下,MongoDB 數字數據類型是 type
double
。還有其他數字類型,如int
、和。您可以根據需要轉換查詢中的類型。從一種類型到另一種類型的轉換有多種運算符(包括字元串內的數字轉換,反之亦然)。$convert就是這樣一種運算符。long``float``NumberDecimal
在處理之前或處理過程中,也有運算符來檢查數據類型是否屬於特定類型。
查詢運算符$type範例,查找
price
欄位類型為string的文件:db.items.find( { price: { $type: "string" } } )
聚合運算符$type範例,獲取具有新欄位的所有文件,該欄位告訴特定欄位的數據類型:
db.items.aggregate([ { $addFields: { price_type: { $type: "$price" } } } ])
備註:
由於來自各種來源或系統的數據饋送,人們會遇到混合數據類型。我懷疑您需要根據需要處理這些 - 在應用程序的某個階段進行辨識和處理。關於混合類型的索引,我認為您可以根據自己的情況利用索引功能:Collation和Partial Indexes。