ArangoDB数据类型 #
一、数据类型概览 #
ArangoDB使用JSON作为数据存储格式,支持丰富的数据类型。
1.1 类型分类 #
text
ArangoDB数据类型
├── 基本类型
│ ├── null
│ ├── boolean
│ ├── number
│ └── string
├── 复合类型
│ ├── array
│ └── object
└── 特殊类型
├── _key
├── _id
├── _rev
└── _from/_to
二、基本类型 #
2.1 null #
表示空值或缺失值:
json
{
"name": "张三",
"middleName": null
}
null的使用场景:
aql
FOR user IN users
FILTER user.deleted_at == null
RETURN user
2.2 boolean #
布尔值,只有两个值:true 和 false:
json
{
"name": "张三",
"isActive": true,
"isAdmin": false
}
布尔操作:
aql
FOR user IN users
FILTER user.isActive == true
RETURN user
2.3 number #
数字类型,支持整数和浮点数:
json
{
"age": 28,
"score": 95.5,
"balance": -100.50,
"scientific": 1.5e10
}
数字操作:
aql
FOR product IN products
RETURN {
name: product.name,
price: product.price,
tax: product.price * 0.1,
total: product.price * 1.1
}
2.4 string #
字符串类型,使用双引号:
json
{
"name": "张三",
"email": "zhangsan@example.com",
"description": "这是一段描述文字"
}
字符串操作:
aql
FOR user IN users
RETURN {
name: UPPER(user.name),
email: LOWER(user.email),
nameLength: LENGTH(user.name)
}
三、复合类型 #
3.1 array #
数组类型,存储有序元素列表:
json
{
"hobbies": ["阅读", "游泳", "编程"],
"scores": [90, 85, 92],
"mixed": ["text", 123, true, null]
}
数组操作:
aql
FOR user IN users
RETURN {
name: user.name,
hobbyCount: LENGTH(user.hobbies),
firstHobby: user.hobbies[0],
hasReading: "阅读" IN user.hobbies
}
嵌套数组:
json
{
"matrix": [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
}
3.2 object #
对象类型,存储键值对:
json
{
"name": "张三",
"address": {
"city": "北京",
"district": "朝阳区",
"street": "朝阳路100号",
"zipcode": "100020"
},
"contact": {
"phone": "13800138000",
"email": "zhangsan@example.com"
}
}
对象访问:
aql
FOR user IN users
RETURN {
name: user.name,
city: user.address.city,
phone: user.contact.phone
}
嵌套对象:
json
{
"company": {
"name": "科技公司",
"address": {
"city": "北京",
"location": {
"lat": 39.9042,
"lng": 116.4074
}
}
}
}
四、特殊类型 #
4.1 _key #
文档的唯一标识符,在集合内唯一:
json
{
"_key": "user_001",
"name": "张三"
}
_key的特点:
- 字符串类型
- 集合内唯一
- 自动生成或手动指定
- 不可修改
手动指定_key:
aql
INSERT {
"_key": "user_001",
"name": "张三"
} INTO users
4.2 _id #
文档的全局标识符,格式为 集合名/_key:
json
{
"_id": "users/user_001",
"_key": "user_001",
"name": "张三"
}
_id的特点:
- 字符串类型
- 数据库内唯一
- 自动生成
- 格式:
collection/_key
4.3 _rev #
文档的版本号,用于乐观锁:
json
{
"_id": "users/user_001",
"_key": "user_001",
"_rev": "_abc123",
"name": "张三"
}
_rev的特点:
- 字符串类型
- 每次更新自动变化
- 用于并发控制
4.4 _from 和 _to #
边集合专用,表示边的起点和终点:
json
{
"_id": "follows/123",
"_key": "123",
"_from": "users/user_001",
"_to": "users/user_002",
"createdAt": "2024-01-15"
}
五、类型检查 #
5.1 类型检查函数 #
| 函数 | 说明 |
|---|---|
| IS_NULL(x) | 是否为null |
| IS_BOOL(x) | 是否为布尔值 |
| IS_NUMBER(x) | 是否为数字 |
| IS_STRING(x) | 是否为字符串 |
| IS_ARRAY(x) | 是否为数组 |
| IS_OBJECT(x) | 是否为对象 |
| IS_DATESTRING(x) | 是否为日期字符串 |
| IS_KEY(x) | 是否为有效的_key |
5.2 类型检查示例 #
aql
FOR user IN users
RETURN {
name: user.name,
hasAge: IS_NUMBER(user.age),
hasHobbies: IS_ARRAY(user.hobbies),
hasAddress: IS_OBJECT(user.address)
}
5.3 TYPENAME函数 #
aql
RETURN TYPENAME(123)
RETURN TYPENAME("hello")
RETURN TYPENAME([1, 2, 3])
RETURN TYPENAME({ name: "张三" })
六、类型转换 #
6.1 TO_STRING #
aql
RETURN TO_STRING(123)
RETURN TO_STRING(true)
RETURN TO_STRING(null)
6.2 TO_NUMBER #
aql
RETURN TO_NUMBER("123")
RETURN TO_NUMBER(true)
RETURN TO_NUMBER("abc")
6.3 TO_BOOL #
aql
RETURN TO_BOOL(1)
RETURN TO_BOOL(0)
RETURN TO_BOOL("")
RETURN TO_BOOL("hello")
6.4 TO_ARRAY #
aql
RETURN TO_ARRAY("hello")
RETURN TO_ARRAY(123)
6.5 TO_LIST #
aql
FOR user IN users
RETURN TO_LIST(user.hobbies)
七、日期类型 #
7.1 日期存储 #
ArangoDB没有专门的日期类型,通常使用字符串或数字:
json
{
"createdAt": "2024-01-15T10:30:00Z",
"timestamp": 1705315800,
"date": "2024-01-15"
}
7.2 日期函数 #
aql
FOR user IN users
RETURN {
name: user.name,
year: DATE_YEAR(user.createdAt),
month: DATE_MONTH(user.createdAt),
day: DATE_DAY(user.createdAt),
hour: DATE_HOUR(user.createdAt),
minute: DATE_MINUTE(user.createdAt),
dayOfWeek: DATE_DAYOFWEEK(user.createdAt),
formatted: DATE_FORMAT(user.createdAt, "%Y-%m-%d %H:%M:%S")
}
7.3 日期比较 #
aql
FOR user IN users
FILTER user.createdAt > DATE_SUBTRACT(DATE_NOW(), 30, "days")
RETURN user
7.4 日期计算 #
aql
LET now = DATE_NOW()
LET tomorrow = DATE_ADD(now, 1, "day")
LET lastWeek = DATE_SUBTRACT(now, 7, "days")
RETURN {
now: now,
tomorrow: tomorrow,
lastWeek: lastWeek
}
八、JSON Schema验证 #
8.1 定义Schema #
json
{
"rule": {
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "number", "minimum": 0 },
"email": { "type": "string", "format": "email" }
},
"required": ["name", "email"]
}
}
8.2 创建带验证的集合 #
javascript
db._create("users", {
schema: {
rule: {
type: "object",
properties: {
name: { type: "string" },
age: { type: "number", minimum: 0 },
email: { type: "string" }
},
required: ["name", "email"]
}
}
});
九、数据类型最佳实践 #
9.1 命名规范 #
text
推荐命名:
├── 使用驼峰命名法:firstName, lastName
├── 布尔值使用is/has前缀:isActive, hasPermission
├── 日期字段使用_at后缀:createdAt, updatedAt
└── ID字段使用Id后缀:userId, orderId
9.2 类型选择建议 #
| 场景 | 推荐类型 |
|---|---|
| 标识符 | string (_key) |
| 金额 | number |
| 状态 | string 或 number |
| 标签列表 | array |
| 地址信息 | object |
| 时间戳 | string (ISO 8601) |
9.3 文档设计示例 #
json
{
"_key": "user_001",
"firstName": "张",
"lastName": "三",
"email": "zhangsan@example.com",
"age": 28,
"isActive": true,
"roles": ["user", "admin"],
"profile": {
"avatar": "https://example.com/avatar.jpg",
"bio": "软件工程师"
},
"address": {
"city": "北京",
"district": "朝阳区",
"street": "朝阳路100号"
},
"hobbies": ["阅读", "游泳", "编程"],
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-20T15:45:00Z"
}
十、总结 #
数据类型要点:
- 基本类型:null、boolean、number、string
- 复合类型:array、object
- 特殊属性:_key、_id、_rev、_from、_to
- 日期处理:使用字符串或时间戳
- 类型安全:使用Schema验证
下一步,让我们学习数据库与集合操作!
最后更新:2026-03-27