作為文檔型NoSQL數據庫的典型代表,MongoDB提供了豐富的數據類型,主要有:ObjectId、String、Boolean、Number、Arrays、Object、Null、Timestamp和Date。下面通過具體的示例來演示其中主要的數據類型以及它們的作用。
| 點擊這裏查看視頻講解:【趙渝強老師】MongoDB的數據類型 |
一、 ObjectId
ObjectId類似關係型數據庫中的主鍵,MongoDB使用它可以唯一確定集合中的一條文檔。ObjectId是一個BSON類型字符串,其中包含了時間戳、機器標識碼、進程ID和隨機數。因此在分佈式環境下,使用ObjectId可以避免MongoDB主鍵的衝突。當向MongoDB集合中插入文檔時,可以通過使用字段_id來指定ObjectId;如果沒有指定ObjectId,MongoDB會自動生成ObjectId。
下面通過一個簡單的示例來進行演示。 (1)使用mongoshell連接到MongoDB服務器端,並切換到scott數據庫中。
$ mongo
test@nosql11 1> use scott
(2)創建一張名叫test1的新集合,並向集合中插入一條文檔。
scott@nosql11 2> db.test1.insertOne({name:"Tom",age:25})
# 輸出的信息如下:
{
"acknowledged" : true,
"insertedId" : ObjectId("624a559df22c930516afc4e2")
}
(3)查詢集合test1中的數據。
scott@nosql11 3> db.test1.find()
# 輸出的信息如下:
{ "_id" : ObjectId("624a559df22c930516afc4e2"), "name" : "Tom", "age" : 25 }
# 由於在第(2)步插入文檔時沒有指定_id,MongoDB將會為插入的文檔自動生成一個ObjectId。
二、 日期類型
在MongoDB中表示日期和時間可以通過Date和Timestamp兩種不同的方式進行表示,MongoDB支持使用不同的方式來創建它們。下面通過具體的示例來進行演示。
(1)使用Date()插入一個字符串類型的時間數據。
scott@nosql11 5> Date()
Mon Apr 04 2025 10:37:19 GMT+0800 (CST)
(2)使用new Date()插入一個isodate類型的格林尼治標準時間數據。
scott@nosql11 6> new Date()
ISODate("2025-04-04T02:37:26.813Z")
(3)ISODate()與new Date()方式插入的時間數據類似。
scott@nosql11 7> ISODate()
ISODate("2025-04-04T02:37:35.642Z")
三、 數值類型
MongoDB中表示數值類型的數據時可以使用不同的方式。例如,使用Double表示浮點數;而使用Integer表示一個整數。下面的語句將向MongoDB的表中各插入一個Integer類型和Double類型的數據。
scott@nosql11 12> db.test1.insertOne({x1:1,x2:3.14});
MongoDB還支持使用NumberLong、NumberInt和NumberDecimal來表示數值類型的數據。下表列舉了它們之間的區別。
下面通過幾個具體的示例來演示MongoDB在存儲數值類型數據時的區別。 (1)創建一張新集合test2,並向集合中插入下面的測試數據。
scott@nosql11 7> db.test2.insert(
[
{_id:1,val:NumberDecimal('9.99'),Description:'Decimal'},
{_id:2,val:9.99,Description:'Double'},
{_id:3,val:10,Description:'Double'},
{_id:4,val:NumberLong(10),Description:'Long'},
{_id:5,val:NumberDecimal('10.0'),Description:'Decimal'}
]
);
(2)指定下面的查詢條件查詢集合中的數據。
scott@nosql11 8> db.test2.find({'val':9.99});
# 輸出的信息如下:
{ "_id" : 2, "val" : 9.99, "Description" : "Double" }
# 條件{'val':9.99}將匹配Double類型的9.99;而不是NumberDecimal代表的9.99。
(3)如果要匹配NumberDecimal代表的9.99需要指定下面的查詢條件。
scott@nosql11 9> db.test2.find({'val':NumberDecimal('9.99')});
# 輸出的信息如下:
{ "_id" : 1, "val" : NumberDecimal("9.99"), "Description" : "Decimal" }
(4)指定下面的查詢條件查詢集合中的數據。
scott@nosql11 10> db.test2.find({'val':10});
# 輸出的信息如下:
{ "_id" : 3, "val" : 10, "Description" : "Double" }
{ "_id" : 4, "val" : NumberLong(10), "Description" : "Long" }
{ "_id" : 5, "val" : NumberDecimal("10.0"), "Description" : "Decimal" }
# 對於整個數字10的匹配,將匹配所有的數據類型10。
(5)指定下面的查詢條件查詢集合中的數據。
scott@nosql11 11> db.test2.find({'val':NumberDecimal('10')});
# 輸出的信息如下:
{ "_id" : 3, "val" : 10, "Description" : "Double" }
{ "_id" : 4, "val" : NumberLong(10), "Description" : "Long" }
{ "_id" : 5, "val" : NumberDecimal("10.0"), "Description" : "Decimal" }
四、 其他數據類型
對與MongoDB支持的其他幾種數據類型,如String、Boolean、Arrays、Object,下面通過一個簡單示例來進行演示。
scott@nosql11 12> db.test3.insertOne(
{
_id:'stu001',
name:'Jone',
married:false,
age:18,
courses:[{cname:'語文',credit:4},
{cname:'英語',credit:3}
]
});
# 其中:
# name: 表示姓名,是一個字符串類型的數據。
# married:表示是否結婚,是一個Boolean布爾類型的數據。
# age: 表示年齡,是一個數值類型的數據。
# courses:表示課程列表,是一個數組類型的數據。而數組中的每一個元素又是一個對象,
包含課程的名稱和學分。