gomog/API_EXAMPLES.md

9.8 KiB

Gomog API 使用示例

本文档提供详细的 API 使用示例,帮助你快速上手 Gomog 服务器。

基础配置

默认服务器地址:

  • HTTP: http://localhost:8080
  • TCP: localhost:27017

API 路径格式:/api/v1/{database}/{collection}/{operation}


插入操作 (Insert)

单条插入

curl -X POST http://localhost:8080/api/v1/testdb/users/insert \
  -H "Content-Type: application/json" \
  -d '{
    "documents": [
      {
        "name": "张三",
        "age": 28,
        "email": "zhangsan@example.com",
        "department": "技术部",
        "skills": ["Go", "Python", "Linux"],
        "created_at": "2024-01-01T00:00:00Z"
      }
    ]
  }'

响应:

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

批量插入

curl -X POST http://localhost:8080/api/v1/testdb/users/insert \
  -H "Content-Type: application/json" \
  -d '{
    "documents": [
      {"name": "李四", "age": 32, "department": "产品部"},
      {"name": "王五", "age": 25, "department": "技术部"},
      {"name": "赵六", "age": 30, "department": "设计部"}
    ],
    "ordered": true
  }'

查询操作 (Find)

基本查询

curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {"department": "技术部"}
  }'

条件查询

比较操作符

# 年龄大于 28
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{"filter": {"age": {"$gt": 28}}}'

# 年龄小于等于 30
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{"filter": {"age": {"$lte": 30}}}'

# 年龄在范围内
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {
      "age": {"$gte": 25, "$lte": 30}
    }
  }'

逻辑操作符

# OR 查询
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {
      "$or": [
        {"department": "技术部"},
        {"department": "产品部"}
      ]
    }
  }'

# AND 查询
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {
      "$and": [
        {"age": {"$gt": 25}},
        {"department": "技术部"}
      ]
    }
  }'

数组操作符

# IN 查询
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {
      "department": {"$in": ["技术部", "产品部"]}
    }
  }'

# 包含所有指定技能
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {
      "skills": {"$all": ["Go", "Python"]}
    }
  }'

投影(选择字段)

# 只返回 name 和 email
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {"department": "技术部"},
    "projection": {"name": 1, "email": 1, "_id": 1}
  }'

排序

# 按年龄降序
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {},
    "sort": {"age": -1}
  }'

# 多字段排序
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "sort": {"department": 1, "age": -1}
  }'

分页

# 跳过前 10 条,取 20 条
curl -X POST http://localhost:8080/api/v1/testdb/users/find \
  -H "Content-Type: application/json" \
  -d '{
    "skip": 10,
    "limit": 20
  }'

更新操作 (Update)

单条更新

curl -X POST http://localhost:8080/api/v1/testdb/users/update \
  -H "Content-Type: application/json" \
  -d '{
    "updates": [
      {
        "q": {"name": "张三"},
        "u": {"$set": {"age": 29, "email": "zhangsan.new@example.com"}}
      }
    ]
  }'

批量更新

curl -X POST http://localhost:8080/api/v1/testdb/users/update \
  -H "Content-Type: application/json" \
  -d '{
    "updates": [
      {
        "q": {"department": "技术部"},
        "u": {"$set": {"status": "active"}},
        "multi": true
      }
    ]
  }'

数值操作

# 递增年龄
curl -X POST http://localhost:8080/api/v1/testdb/users/update \
  -H "Content-Type: application/json" \
  -d '{
    "updates": [
      {
        "q": {"name": "李四"},
        "u": {"$inc": {"age": 1}}
      }
    ]
  }'

# 乘以系数
curl -X POST http://localhost:8080/api/v1/testdb/orders/update \
  -H "Content-Type: application/json" \
  -d '{
    "updates": [
      {
        "q": {"category": "electronics"},
        "u": {"$mul": {"price": 0.9}}
      }
    ]
  }'

移除字段

curl -X POST http://localhost:8080/api/v1/testdb/users/update \
  -H "Content-Type: application/json" \
  -d '{
    "updates": [
      {
        "q": {"name": "王五"},
        "u": {"$unset": {"temp_field": 1}}
      }
    ]
  }'

数组操作

# 推入数组
curl -X POST http://localhost:8080/api/v1/testdb/users/update \
  -H "Content-Type: application/json" \
  -d '{
    "updates": [
      {
        "q": {"name": "张三"},
        "u": {"$push": {"skills": "Java"}}
      }
    ]
  }'

# 从数组中移除
curl -X POST http://localhost:8080/api/v1/testdb/users/update \
  -H "Content-Type: application/json" \
  -d '{
    "updates": [
      {
        "q": {"name": "张三"},
        "u": {"$pull": {"skills": "Python"}}
      }
    ]
  }'

删除操作 (Delete)

删除单个文档

curl -X POST http://localhost:8080/api/v1/testdb/users/delete \
  -H "Content-Type: application/json" \
  -d '{
    "deletes": [
      {
        "q": {"name": "赵六"},
        "limit": 1
      }
    ]
  }'

删除多个文档

curl -X POST http://localhost:8080/api/v1/testdb/users/delete \
  -H "Content-Type: application/json" \
  -d '{
    "deletes": [
      {
        "q": {"department": "设计部"},
        "limit": 0
      }
    ]
  }'

聚合查询 (Aggregate)

简单聚合

分组统计

# 按部门统计人数
curl -X POST http://localhost:8080/api/v1/testdb/users/aggregate \
  -H "Content-Type: application/json" \
  -d '{
    "pipeline": [
      {
        "$group": {
          "_id": "$department",
          "count": {"$sum": 1},
          "avg_age": {"$avg": "$age"}
        }
      }
    ]
  }'

过滤后分组

# 统计技术部员工信息
curl -X POST http://localhost:8080/api/v1/testdb/users/aggregate \
  -H "Content-Type: application/json" \
  -d '{
    "pipeline": [
      {"$match": {"department": "技术部"}},
      {
        "$group": {
          "_id": null,
          "total": {"$sum": 1},
          "max_age": {"$max": "$age"},
          "min_age": {"$min": "$age"}
        }
      }
    ]
  }'

复杂聚合管道

多阶段处理

# 计算各部门活跃员工的平均年龄,并排序
curl -X POST http://localhost:8080/api/v1/testdb/users/aggregate \
  -H "Content-Type: application/json" \
  -d '{
    "pipeline": [
      {"$match": {"status": "active"}},
      {
        "$group": {
          "_id": "$department",
          "avg_age": {"$avg": "$age"},
          "employee_count": {"$sum": 1}
        }
      },
      {"$sort": {"avg_age": -1}},
      {"$limit": 5}
    ]
  }'

字段投影和计算

curl -X POST http://localhost:8080/api/v1/testdb/users/aggregate \
  -H "Content-Type: application/json" \
  -d '{
    "pipeline": [
      {"$match": {"department": "技术部"}},
      {
        "$project": {
          "name": 1,
          "age": 1,
          "skill_count": {"$size": "$skills"},
          "upper_name": {"$toUpper": "$name"}
        }
      }
    ]
  }'

数组展开

# 展开 skills 数组
curl -X POST http://localhost:8080/api/v1/testdb/users/aggregate \
  -H "Content-Type: application/json" \
  -d '{
    "pipeline": [
      {"$unwind": "$skills"},
      {
        "$group": {
          "_id": "$skills",
          "users": {"$push": "$name"}
        }
      }
    ]
  }'

左连接 Lookup

# 关联用户和订单
curl -X POST http://localhost:8080/api/v1/testdb/users/aggregate \
  -H "Content-Type: application/json" \
  -d '{
    "pipeline": [
      {
        "$lookup": {
          "from": "testdb.orders",
          "localField": "_id",
          "foreignField": "user_id",
          "as": "orders"
        }
      }
    ]
  }'

计数

curl -X POST http://localhost:8080/api/v1/testdb/users/aggregate \
  -H "Content-Type: application/json" \
  -d '{
    "pipeline": [
      {"$match": {"status": "active"}},
      {"$count": "active_count"}
    ]
  }'

错误处理

常见错误响应

集合不存在

{
  "ok": 0,
  "error": "collection not found",
  "status": 500
}

无效请求

{
  "ok": 0,
  "error": "invalid request body",
  "status": 400
}

未知操作

{
  "ok": 0,
  "error": "unknown operation: invalid",
  "status": 400
}

最佳实践

1. 批量操作

尽量使用批量插入和批量更新,减少网络往返。

2. 合理使用投影

只查询需要的字段,减少数据传输量。

3. 添加索引

虽然主要在内存查询,但对于大数据集,考虑在数据库层添加索引。

4. 分页查询

使用 skip 和 limit 进行分页,避免一次性加载大量数据。

5. 聚合优化

将 $match 放在管道前面,尽早过滤数据。


TCP 协议示例

如果使用 TCP 协议,消息格式如下:

{
  "operation": "find",
  "collection": "testdb.users",
  "params": {
    "filter": {"age": {"$gte": 25}}
  }
}

发送到 localhost:27017 即可。