gomog/manual/HTTP_API.md

14 KiB
Raw Permalink Blame History

Gomog HTTP API 参考文档

版本: v1.0.0-alpha
最后更新: 2026-03-14
基础路径: /api/v1


📖 目录

  1. 概述
  2. 认证与授权
  3. 数据库管理
  4. 集合管理
  5. 文档操作
  6. 查询操作
  7. 聚合操作
  8. 索引管理
  9. 错误处理
  10. 响应格式

概述

协议

  • 传输协议: HTTP/1.1 或 HTTP/2
  • 数据格式: JSON
  • 字符编码: UTF-8
  • 默认端口: 8080

基础 URL

http://localhost:8080/api/v1/{database}/{collection}/{operation}

URL 参数说明

参数 说明 示例
{database} 数据库名称 testdb
{collection} 集合名称 users
{operation} 操作类型 find, insert, update

HTTP 方法

方法 用途
POST 执行数据库操作(查询、插入、更新、删除等)
GET 获取元数据信息

数据库管理

列出所有数据库

端点: POST /api/v1/admin/listDatabases

请求:

curl -X POST http://localhost:8080/api/v1/admin/listDatabases

响应:

{
  "ok": 1,
  "databases": [
    {"name": "testdb", "sizeOnDisk": 1024, "empty": false},
    {"name": "prod", "sizeOnDisk": 2048, "empty": false}
  ],
  "totalSize": 3072,
  "totalSizeMb": 3
}

列出当前数据库的集合

端点: POST /api/v1/{database}/listCollections

请求:

curl -X POST http://localhost:8080/api/v1/testdb/listCollections

响应:

{
  "ok": 1,
  "collections": [
    {"name": "users", "type": "collection"},
    {"name": "orders", "type": "collection"}
  ]
}

集合管理

创建集合

Gomog 会在首次插入数据时自动创建集合,无需手动创建。

删除集合

端点: POST /api/v1/{database}/{collection}/drop

请求:

curl -X POST http://localhost:8080/api/v1/testdb/users/drop

响应:

{
  "ok": 1,
  "nIndexesWas": 1
}

重命名集合

端点: POST /api/v1/{database}/{collection}/renameCollection

请求:

curl -X POST http://localhost:8080/api/v1/testdb/users/renameCollection \
  -H "Content-Type: application/json" \
  -d '{"to": "members"}'

响应:

{
  "ok": 1
}

文档操作

插入文档

端点: POST /api/v1/{database}/{collection}/insert

请求参数:

参数 类型 必填 说明
documents array 要插入的文档数组
ordered boolean 是否按顺序插入(默认 true

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/insert \
  -H "Content-Type: application/json" \
  -d '{
    "documents": [
      {
        "name": "Alice",
        "age": 30,
        "email": "alice@example.com"
      },
      {
        "name": "Bob",
        "age": 25,
        "email": "bob@example.com"
      }
    ]
  }'

响应:

{
  "ok": 1,
  "n": 2,
  "insertedIds": {
    "0": "20240101120000.000000000",
    "1": "20240101120001.000000000"
  }
}

错误响应:

{
  "ok": 0,
  "errmsg": "duplicate key error",
  "code": 11000
}

查询操作

查询文档

端点: POST /api/v1/{database}/{collection}/find

请求参数:

参数 类型 必填 说明
filter object 查询条件(默认 {}
projection object 字段投影
sort object 排序规则
skip number 跳过文档数
limit number 返回文档数限制

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {
      "age": {"$gte": 25, "$lte": 30},
      "department": "技术部"
    },
    "projection": {
      "name": 1,
      "email": 1,
      "_id": 0
    },
    "sort": {"age": -1},
    "limit": 10
  }'

响应:

{
  "ok": 1,
  "cursor": {
    "firstBatch": [
      {"name": "Alice", "email": "alice@example.com"},
      {"name": "Bob", "email": "bob@example.com"}
    ],
    "id": 0,
    "ns": "testdb.users"
  }
}

查询单个文档

端点: POST /api/v1/{database}/{collection}/findOne

请求参数: 同 find

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/findOne \
  -H "Content-Type: application/json" \
  -d '{"filter": {"email": "alice@example.com"}}'

响应:

{
  "ok": 1,
  "value": {
    "_id": "20240101120000.000000000",
    "name": "Alice",
    "age": 30,
    "email": "alice@example.com"
  }
}

统计文档数

端点: POST /api/v1/{database}/{collection}/count

请求参数:

参数 类型 必填 说明
filter object 查询条件(默认 {}
limit number 最大计数限制
skip number 跳过文档数

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/count \
  -H "Content-Type: application/json" \
  -d '{"filter": {"age": {"$gte": 25}}}'

响应:

{
  "ok": 1,
  "n": 15
}

更新操作

更新单个文档

端点: POST /api/v1/{database}/{collection}/update

请求参数:

参数 类型 必填 说明
filter object 查询条件
update object 更新操作
upsert boolean 不存在则插入(默认 false
multi boolean 更新多个(默认 false

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/update \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {"name": "Alice"},
    "update": {
      "$set": {"age": 31},
      "$inc": {"loginCount": 1}
    }
  }'

响应:

{
  "ok": 1,
  "n": 1,
  "nModified": 1,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedId": null
}

更新多个文档

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/update \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {"department": "技术部"},
    "update": {"$inc": {"salary": 1000}},
    "multi": true
  }'

Upsert 操作

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/update \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {"email": "charlie@example.com"},
    "update": {
      "$setOnInsert": {
        "email": "charlie@example.com",
        "name": "Charlie",
        "age": 28
      }
    },
    "upsert": true
  }'

响应:

{
  "ok": 1,
  "n": 1,
  "nModified": 0,
  "upsertedId": "20240101120002.000000000"
}

删除操作

删除单个文档

端点: POST /api/v1/{database}/{collection}/delete

请求参数:

参数 类型 必填 说明
filter object 查询条件
multi boolean 删除多个(默认 false

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/delete \
  -H "Content-Type: application/json" \
  -d '{"filter": {"email": "alice@example.com"}}'

响应:

{
  "ok": 1,
  "n": 1,
  "deletedCount": 1
}

删除多个文档

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/delete \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {"status": "inactive"},
    "multi": true
  }'

聚合操作

执行聚合管道

端点: POST /api/v1/{database}/{collection}/aggregate

请求参数:

参数 类型 必填 说明
pipeline array 聚合管道数组
cursor object 游标选项
explain boolean 是否返回执行计划

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/orders/aggregate \
  -H "Content-Type: application/json" \
  -d '{
    "pipeline": [
      {
        "$match": {
          "status": "completed",
          "createdAt": {"$gte": "2024-01-01"}
        }
      },
      {
        "$group": {
          "_id": "$customerId",
          "totalAmount": {"$sum": "$amount"},
          "orderCount": {"$sum": 1},
          "avgAmount": {"$avg": "$amount"}
        }
      },
      {
        "$sort": {"totalAmount": -1}
      },
      {
        "$limit": 10
      }
    ]
  }'

响应:

{
  "ok": 1,
  "cursor": {
    "firstBatch": [
      {
        "_id": "cust_001",
        "totalAmount": 15000,
        "orderCount": 5,
        "avgAmount": 3000
      },
      {
        "_id": "cust_002",
        "totalAmount": 12000,
        "orderCount": 4,
        "avgAmount": 3000
      }
    ],
    "id": 0,
    "ns": "testdb.orders"
  }
}

支持的聚合阶段

详见 聚合管道文档


索引管理

创建索引

端点: POST /api/v1/{database}/{collection}/createIndex

请求参数:

参数 类型 必填 说明
keys object 索引键定义
unique boolean 是否唯一索引
name string 索引名称
background boolean 后台创建(默认 false

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/createIndex \
  -H "Content-Type: application/json" \
  -d '{
    "keys": {"email": 1},
    "unique": true,
    "name": "idx_email_unique"
  }'

响应:

{
  "ok": 1,
  "createdCollectionAutomatically": false,
  "numIndexesBefore": 1,
  "numIndexesAfter": 2,
  "note": "all indexes already exist"
}

列出索引

端点: POST /api/v1/{database}/{collection}/getIndexes

请求:

curl -X POST http://localhost:8080/api/v1/testdb/users/getIndexes

响应:

{
  "ok": 1,
  "indexes": [
    {
      "v": 2,
      "key": {"_id": 1},
      "name": "_id_",
      "ns": "testdb.users"
    },
    {
      "v": 2,
      "key": {"email": 1},
      "name": "idx_email_unique",
      "unique": true,
      "ns": "testdb.users"
    }
  ]
}

删除索引

端点: POST /api/v1/{database}/{collection}/dropIndex

请求参数:

参数 类型 必填 说明
index string 索引名称

请求示例:

curl -X POST http://localhost:8080/api/v1/testdb/users/dropIndex \
  -H "Content-Type: application/json" \
  -d '{"index": "idx_email_unique"}'

响应:

{
  "ok": 1,
  "nIndexesWas": 2
}

错误处理

错误响应格式

{
  "ok": 0,
  "errmsg": "错误描述信息",
  "code": 错误码,
  "codeName": "错误名称"
}

常见错误码

错误码 错误名称 说明
1 InternalError 内部错误
2 BadValue 参数值错误
7 NoSuchKey 键不存在
11000 DuplicateKey 重复键值
26 NamespaceNotFound 集合不存在
43 NamespaceExists 集合已存在
52 InvalidPipelineOperator 无效的聚合操作符

错误处理示例

请求重复键值:

// 请求
{
  "documents": [{"email": "existing@example.com"}]
}

// 响应
{
  "ok": 0,
  "errmsg": "duplicate key error",
  "code": 11000,
  "codeName": "DuplicateKey"
}

响应格式

成功响应

{
  "ok": 1,
  // 其他响应数据...
}

分页响应

{
  "ok": 1,
  "cursor": {
    "firstBatch": [...],
    "nextBatch": [...],
    "id": 12345,
    "ns": "database.collection"
  }
}

批量操作响应

{
  "ok": 1,
  "n": 10,
  "insertedIds": {"0": "id1", "1": "id2"},
  "upsertedIds": {},
  "matchedCount": 10,
  "modifiedCount": 8,
  "deletedCount": 0
}

高级查询

查询操作符

详见 查询操作符文档

比较操作符

{
  "filter": {
    "age": {"$gt": 25},
    "salary": {"$gte": 5000, "$lte": 10000},
    "status": {"$in": ["active", "pending"]}
  }
}

逻辑操作符

{
  "filter": {
    "$or": [
      {"age": {"$lt": 25}},
      {"salary": {"$gt": 8000}}
    ]
  }
}

元素操作符

{
  "filter": {
    "tags": {"$elemMatch": {"$eq": "important"}},
    "score": {"$exists": true}
  }
}

更新操作符

详见 更新操作符文档

字段更新

{
  "update": {
    "$set": {"status": "active"},
    "$unset": {"tempField": ""},
    "$rename": {"oldName": "newName"}
  }
}

数组操作

{
  "update": {
    "$push": {"scores": 95},
    "$addToSet": {"tags": "new"},
    "$pull": {"items": {"price": {"$lt": 100}}}
  }
}

算术更新

{
  "update": {
    "$inc": {"viewCount": 1},
    "$mul": {"price": 0.9}
  }
}

性能优化

使用投影

# 只返回需要的字段
{"projection": {"name": 1, "email": 1, "_id": 0}}

使用索引

# 为常用查询字段创建索引
{"keys": {"email": 1, "status": 1}}

限制结果集

# 总是使用 limit
{"limit": 100}

避免全表扫描

# ❌ 不推荐
{"filter": {"$expr": {"$gt": ["$field1", "$field2"]}}}

# ✅ 推荐
{"filter": {"field1": {"$gt": 100}}}

最佳实践

1. 批量操作

# 批量插入而不是逐条插入
{"documents": [{...}, {...}, {...}]}

2. 合理使用 upsert

# 使用 $setOnInsert 避免覆盖现有数据
{
  "filter": {"email": "user@example.com"},
  "update": {"$setOnInsert": {"name": "User"}},
  "upsert": true
}

3. 事务性操作

对于需要事务的场景,使用 PostgreSQL 或 DM8 作为底层数据库。

4. 监控慢查询

log:
  level: "debug"
  slow_query_threshold: "100ms"

附录

HTTP 状态码

状态码 说明
200 成功
400 请求参数错误
404 资源不存在
500 服务器内部错误

数据类型映射

MongoDB SQLite PostgreSQL
String TEXT VARCHAR
Number REAL DOUBLE PRECISION
Integer INTEGER BIGINT
Boolean INTEGER BOOLEAN
Array JSONB JSONB
Object JSONB JSONB
Date DATETIME TIMESTAMP

维护者: Gomog Team
许可证: MIT