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"
}

十、总结 #

数据类型要点:

  1. 基本类型:null、boolean、number、string
  2. 复合类型:array、object
  3. 特殊属性:_key、_id、_rev、_from、_to
  4. 日期处理:使用字符串或时间戳
  5. 类型安全:使用Schema验证

下一步,让我们学习数据库与集合操作!

最后更新:2026-03-27