MongoDB基本数据类型
1. ObjectId
{
"_id": ObjectId("5f7c45a9bcdd4e00018b4567")
}
2. 字符串(String)
{
"name": "John Doe",
"email": "john.doe@example.com"
}
3. 数值(Number)
{
"age": 30,
"salary": NumberDecimal("123456.78"),
"orderCount": NumberInt(100)
}
4. 布尔(Boolean)
{
"isStudent": true,
"isActive": false
}
5. 日期(Date)
{
"createdAt": ISODate("2022-01-01T00:00:00Z")
}
6. 数组(Array)
{
"hobbies": ["reading", "gaming", "cooking"],
"scores": [90, 95, 88]
}
7. 文档(Object)
{
"address": {
"city": "New York",
"country": "USA",
"zip": "10001"
}
}
8. 内嵌文档(Embedded Documents)
{
"personalInfo": {
"firstName": "John",
"lastName": "Doe",
"contact": {
"phone": "+1-555-1234567",
"email": "john.doe@example.com"
}
}
}
9. 二进制数据(Binary)
{
"profileImage": BinData(0,"SGVsbG8gd29ybGQ=") // Base64编码的"Hello world"
}
10. 正则表达式(Regex)
{
"searchPattern": /john/i // 不区分大小写的"john"搜索
}
11. 地理位置(Geo)
{
"location": {
"type": "Point",
"coordinates": [40.7128, -74.0060] // 纽约市的经纬度坐标
}
}
请注意,上述例子中的ISODate
、NumberDecimal
、NumberInt
和 BinData
都是根据MongoDB Shell的语法编写的,在实际的编程语言驱动程序中,你可能需要使用相应语言的数据类型或方法来表示这些数据。例如,在Node.js的Mongoose库中,你可以直接使用JavaScript的Date
对象表示日期,使用mongoose.Decimal128
表示高精度十进制数等。
MongoDB数据结构
MongoDB的数据结构以文档为中心,它的核心概念如下:
1. 文档(Document)
在MongoDB中,文档是最基本的数据单元,类似于关系型数据库中的“行”或“记录”。文档采用BSON(Binary JSON)格式存储,这是一种二进制形式的JSON,可以包含丰富的数据类型,如字符串、数字、日期、布尔值、数组、内嵌文档以及其他特殊的BSON类型(如ObjectId)。文档是一个键值对集合,键必须是字符串,而值可以是各种数据类型,例如:
{
"_id": ObjectId("507f1f77bcf86cd799439011"),
"name": "John Doe",
"age": 30,
"address": {
"street": "123 Example Street",
"city": "New York",
"state": "NY"
},
"hobbies": ["Reading", "Programming", "Gardening"]
}
上述文档包含了一个人的名字、年龄、地址(这是一个内嵌文档)和一系列爱好(这是一个数组)。
2. 集合(Collection)
集合在MongoDB中对应于关系型数据库中的“表”,它是文档的逻辑分组。然而,与传统的关系型数据库表相比,MongoDB的集合具有无模式(schema-less)的特性,意味着同一集合内的文档可以有不同的字段和结构。尽管如此,实践中通常会为集合内的文档保持某种模式以便更好地管理和查询数据。
例如,在一个名为users
的集合中,可以存放多个用户文档:
users = [
{
"_id": ObjectId("507f1f77bcf86cd799439011"),
"name": "John Doe",
"age": 30,
...
},
{
"_id": ObjectId("507f1f77bcf86cd799439012"),
"name": "Jane Smith",
"age": 28,
"address": {
"street": "456 Another Street",
"city": "San Francisco",
"state": "CA"
},
"hobbies": ["Painting", "Skiing"]
}
]
以上users
集合包含两个用户文档,每个文档都有自己的独特结构,尽管它们共享一些共同的字段如name
和age
,但也有各自特有的字段,如第二个用户文档中包含的地址信息和不同的爱好列表。
MongoDB数据模型设计
MongoDB作为NoSQL数据库,其数据模型的核心是基于JSON-like文档的集合(Collections),每个文档可以自由地拥有动态schema,这意味着同一个集合中的文档可以有不同的字段和结构。MongoDB的数据模型设计灵活,并且支持以下几种主要的方式来组织和关联数据:
1. 嵌入式数据模型 (Embedded Data Model)
在这种模型中,一个文档可以包含其他相关的数据作为一个子文档数组或嵌套对象。例如,一个用户文档可能直接嵌套包含多个地址记录,而不是将它们放在单独的表中通过外键关联。
{
"_id": ObjectId("..."),
"name": "John Doe",
"addresses": [
{ "type": "home", "street": "123 Main St" },
{ "type": "work", "street": "456 Elm Ave" }
]
}
2. 引用数据模型 (Referenced Data Model)
当数据不适合嵌入或者为了更好的模块化和重复利用时,可以在不同的集合之间创建引用关系。这通常通过存储指向另一个文档 _id
的引用实现。
// 用户集合
{
"_id": ObjectId("user_1"),
"name": "John Doe"
}
// 地址集合
{
"_id": ObjectId("address_1"),
"userId": ObjectId("user_1"),
"type": "home",
"street": "123 Main St"
}
3. 组合使用嵌入和引用
根据实际业务场景,有时会结合使用嵌入和引用,即部分常用或小粒度的数据嵌入在主文档内,而大粒度或频繁更新的数据则通过引用的方式存放在其他集合中。
4. 规范化的数据模型
尽管MongoDB鼓励对数据进行反规范化以便提高读取效率,但也可以按照类似关系数据库的设计原则进行一定程度的规范化,特别是在有复杂事务处理需求的情况下。