集合操作 #

一、集合概述 #

集合(Collection)是存储文档的容器,类似于关系数据库中的表。ArangoDB支持两种类型的集合:

1.1 集合类型 #

类型 说明 用途
Document Collection 文档集合 存储普通文档数据
Edge Collection 边集合 存储图关系(边)

1.2 集合结构 #

text
Database(数据库)
├── users(文档集合)
│   ├── { _key: "1", name: "张三" }
│   └── { _key: "2", name: "李四" }
├── products(文档集合)
│   └── { _key: "p1", name: "商品A" }
└── purchased(边集合)
    └── { _from: "users/1", _to: "products/p1" }

二、创建集合 #

2.1 Web界面创建 #

  1. 选择数据库
  2. 点击 “COLLECTIONS”
  3. 点击 “Add Collection”
  4. 输入集合名称
  5. 选择类型(Document 或 Edge)
  6. 点击 “Create”

2.2 AQL创建 #

aql
CREATE COLLECTION users

2.3 JavaScript创建 #

javascript
db._create("users");

2.4 创建边集合 #

javascript
db._createEdgeCollection("follows");

2.5 带选项创建 #

javascript
db._create("users", {
    waitForSync: true,
    journalSize: 10485760,
    replicationFactor: 2
});

2.6 创建带Schema的集合 #

javascript
db._create("users", {
    schema: {
        rule: {
            type: "object",
            properties: {
                name: { type: "string" },
                email: { type: "string", format: "email" },
                age: { type: "number", minimum: 0 }
            },
            required: ["name", "email"]
        },
        level: "strict"
    }
});

三、查看集合 #

3.1 查看所有集合 #

javascript
db._collections();

3.2 查看非系统集合 #

javascript
db._collections().filter(c => !c.properties().isSystem);

3.3 查看集合属性 #

javascript
db.users.properties();

输出示例:

json
{
    "id": "123",
    "name": "users",
    "waitForSync": false,
    "journalSize": 10485760,
    "isSystem": false,
    "isVolatile": false,
    "type": 2,
    "replicationFactor": 1
}

3.4 查看集合统计 #

javascript
db.users.figures();

输出示例:

json
{
    "alive": {
        "count": 1000,
        "size": 102400
    },
    "dead": {
        "count": 50,
        "size": 5120
    }
}

3.5 查看集合数量 #

javascript
db.users.count();

四、修改集合 #

4.1 重命名集合 #

javascript
db.users.rename("customers");

4.2 修改属性 #

javascript
db.users.properties({
    waitForSync: true
});

4.3 修改复制因子(集群) #

javascript
db.users.properties({
    replicationFactor: 3
});

4.4 修改写关注 #

javascript
db.users.properties({
    writeConcern: 2
});

4.5 更新Schema #

javascript
db.users.properties({
    schema: {
        rule: {
            type: "object",
            properties: {
                name: { type: "string" },
                email: { type: "string" },
                age: { type: "number" },
                phone: { type: "string" }
            },
            required: ["name", "email"]
        },
        level: "moderate"
    }
});

五、删除集合 #

5.1 AQL删除 #

aql
DROP COLLECTION users

5.2 JavaScript删除 #

javascript
db._drop("users");

5.3 删除系统集合 #

javascript
db._drop("_mySystemCollection", true);

5.4 删除前检查 #

javascript
if (db._collection("users") !== null) {
    db._drop("users");
    print("集合已删除");
}

5.5 清空集合 #

aql
FOR doc IN users
    REMOVE doc IN users

更高效的方式:

javascript
db.users.truncate();

六、集合选项详解 #

6.1 waitForSync #

是否等待数据写入磁盘:

javascript
db._create("users", {
    waitForSync: true
});
说明
true 每次写入等待磁盘同步
false 异步写入(默认)

6.2 journalSize #

日志文件大小:

javascript
db._create("users", {
    journalSize: 33554432
});

6.3 replicationFactor #

复制因子(集群模式):

javascript
db._create("users", {
    replicationFactor: 3
});

6.4 writeConcern #

写关注(集群模式):

javascript
db._create("users", {
    writeConcern: 2
});

6.5 shardingStrategy #

分片策略:

javascript
db._create("users", {
    numberOfShards: 4,
    shardKeys: ["city"]
});

6.6 isVolatile #

是否为内存集合:

javascript
db._create("temp_data", {
    isVolatile: true
});

6.7 完整选项示例 #

javascript
db._create("orders", {
    waitForSync: false,
    journalSize: 33554432,
    replicationFactor: 3,
    writeConcern: 2,
    numberOfShards: 4,
    shardKeys: ["userId"],
    isVolatile: false
});

七、Schema验证 #

7.1 Schema级别 #

级别 说明
none 不验证
moderate 仅验证存在的字段
strict 严格验证所有字段

7.2 创建带Schema的集合 #

javascript
db._create("products", {
    schema: {
        rule: {
            type: "object",
            properties: {
                name: { type: "string", minLength: 1 },
                price: { type: "number", minimum: 0 },
                category: { 
                    type: "string",
                    enum: ["电子产品", "服装", "食品"]
                },
                tags: {
                    type: "array",
                    items: { type: "string" }
                }
            },
            required: ["name", "price"]
        },
        level: "strict"
    }
});

7.3 验证示例 #

有效文档:

json
{
    "name": "iPhone 15",
    "price": 7999,
    "category": "电子产品",
    "tags": ["手机", "苹果"]
}

无效文档(会报错):

json
{
    "name": "iPhone 15",
    "price": -100
}

7.4 移除Schema #

javascript
db.products.properties({
    schema: null
});

八、边集合详解 #

8.1 创建边集合 #

javascript
db._createEdgeCollection("follows");

8.2 边文档结构 #

json
{
    "_key": "follow_001",
    "_from": "users/user_001",
    "_to": "users/user_002",
    "createdAt": "2024-01-15T10:30:00Z"
}

8.3 插入边文档 #

aql
INSERT {
    _from: "users/user_001",
    _to: "users/user_002",
    createdAt: DATE_NOW()
} INTO follows

8.4 边集合选项 #

javascript
db._createEdgeCollection("follows", {
    replicationFactor: 2,
    numberOfShards: 4
});

九、集合索引 #

9.1 查看索引 #

javascript
db.users.getIndexes();

9.2 创建索引 #

javascript
db.users.ensureHashIndex(["email"]);
db.users.ensureSkipList(["age"]);
db.users.ensureFulltextIndex(["description"]);

9.3 删除索引 #

javascript
db.users.dropIndex("idx_123");

十、实战示例 #

10.1 创建用户系统集合 #

javascript
db._create("users", {
    schema: {
        rule: {
            type: "object",
            properties: {
                username: { type: "string", minLength: 3 },
                email: { type: "string", format: "email" },
                password: { type: "string", minLength: 8 },
                age: { type: "number", minimum: 0 },
                isActive: { type: "boolean" }
            },
            required: ["username", "email", "password"]
        },
        level: "strict"
    }
});

db.users.ensureHashIndex(["email"], { unique: true });
db.users.ensureHashIndex(["username"], { unique: true });

10.2 创建社交网络集合 #

javascript
db._create("users");
db._create("posts");
db._create("comments");
db._createEdgeCollection("follows");
db._createEdgeCollection("likes");
db._createEdgeCollection("comment_on");

10.3 创建电商系统集合 #

javascript
db._create("products", {
    schema: {
        rule: {
            type: "object",
            properties: {
                name: { type: "string" },
                price: { type: "number", minimum: 0 },
                stock: { type: "integer", minimum: 0 },
                category: { type: "string" }
            },
            required: ["name", "price"]
        }
    }
});

db._create("customers");
db._create("orders");
db._createEdgeCollection("ordered");
db._createEdgeCollection("contains");

db.products.ensureSkipList(["price"]);
db.products.ensureHashIndex(["category"]);

十一、常见问题 #

11.1 集合名称限制 #

text
命名规则:
├── 只能包含字母、数字、下划线
├── 必须以字母开头
├── 长度限制:1-256个字符
├── 区分大小写
└── 系统集合以 _ 开头

11.2 集合数量限制 #

text
建议:
├── 单数据库:不超过1000个集合
├── 单实例:总集合数不超过10000个
└── 集群:根据分片规划

11.3 Schema验证失败 #

javascript
try {
    db.products.insert({
        name: "Product",
        price: -100
    });
} catch (e) {
    print("验证失败: " + e.message);
}

十二、总结 #

集合操作要点:

  1. 创建:db._create() 创建文档集合
  2. 边集合:db._createEdgeCollection() 创建边集合
  3. 属性:properties() 查看/修改属性
  4. 删除:db._drop() 删除集合
  5. 清空:truncate() 清空数据
  6. Schema:使用JSON Schema验证数据

下一步,让我们学习文档操作!

最后更新:2026-03-27