Database-Design

MongoDB 如何處理混合類型?

  • August 11, 2021

我在搞亂 mongodb 並註意到我可以創建混合數據類型。

db.getSiblingDB("bermuda").getCollection("test").insertOne({
   "profile": {
       "t1": 100
   }
});

db.getSiblingDB("bermuda").getCollection("test").insertOne({
   "profile": {
       "t1": "test"
   }
});

結果是: X

但因為"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
;

這提出了很多問題。

  1. Mongodb 是否認為這是 Int32、String、兩者或某種“Any”類型?
  2. 這對索引有何影響?
  3. 有沒有辦法獲得集合“模式”,或者只是查看該集合中的第一個文件?

模式驗證

您可以在集合中的文件上指定模式驗證,以驗證您可以為每個欄位插入或更新的數據類型。此外,您還可以設置其他約束,例如必填欄位。此功能將允許您維護欄位的特定數據類型。請注意,模式驗證是可選的。

欄位類型

預設情況下,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" } } }
])

備註

由於來自各種來源或系統的數據饋送,人們會遇到混合數據類型。我懷疑您需要根據需要處理這些 - 在應用程序的某個階段進行辨識和處理。關於混合類型的索引,我認為您可以根據自己的情況利用索引功能:Collat​​ionPartial Indexes

引用自:https://dba.stackexchange.com/questions/297854