
1. 芒果db 是什么为什么我要把 Key 和它放一起管芒果db 就是 MongoDB 的中文昵称一个面向文档的 NoSQL 数据库。它不要求你先把表结构定死存进去的每条记录都是一段类似 JSON 的文档字段可以随时增减数组、嵌套对象都能直接塞。对经常要接多个大模型 API 的开发者来说这种松散结构特别顺手今天用 A 模型的返回格式明天换 B 模型字段不一样也不用改表。我自己的场景是这样的手上同时跑着几个模型服务每个服务一套 Key散落在不同的.env、settings.json、auth.json里。时间一长哪个 Key 对应哪个模型、额度还剩多少、上次调用是什么时候全靠脑子记。后来我把这些元数据统一写进 MongoDB用 TaoToken 的统一 Key 去调模型本地只维护一份数据库连接配置。这样换模型、加模型、查调用记录都只动数据库不动代码。这篇适合谁刚接触 NoSQL、想跑通芒果db 基本操作的人以及需要统一管理多模型 API Key、想把调用元数据落库的开发者。全文从连接到 CRUD 一步步给命令最后给一个把 TaoToken 接入配置和 MongoDB 操作串起来的完整链路。你跟着敲一遍就能拿到可运行的结果。先说清楚芒果db 和 MySQL 的概念对应不然后面命令容易懵MySQLMongoDB含义databasedatabase数据库tablecollection表 / 集合columnfield字段 / 域rowdocument记录 / 文档indexindex索引记住这张表后面db.class1.insert(...)你就知道它等价于往一张表里插一行。芒果db 的文档用 BSON 存储是 JSON 的二进制扩展支持日期、二进制、ObjectId 这些类型。每条文档默认有个_id主键不指定就自动生成一个 24 位的 ObjectId。2. TaoToken 统一 Key 前置准备与 MongoDB 环境搭建这一节做两件事拿到 TaoToken 的统一 Key把 MongoDB 跑起来。两件事都不难但顺序别乱Key 先拿到后面配置里要用。2.1 拿 TaoToken 统一 KeyTaoToken 的作用是把多个模型的调用收敛到一个入口你只需要一个 Base URL 和一个 Key就能在代码里切换不同模型。对做 MongoDB 元数据管理的人来说好处是数据库里存的模型标识、调用记录都指向同一个网关不用为每个厂商单独维护一套鉴权逻辑。操作路径打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 进控制台在 API Keys 页面创建一个新 Key。创建完先复制存好页面刷新后完整 Key 就不再显示了。拿到 Key 之后把两个地址记牢Base URLhttps://taotoken.net/api注意这个不带 UTM 参数代码里填这个API Keys 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content如果你后面要长期跑编码类任务或者 Agent可以了解下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。想先在网页里验证模型通不通用模型对话页https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入细节查文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。2.2 启动 MongoDB 并进入 shell假设你已经装好了 MongoDB。Windows 下进 bin 目录启动服务再进 shellcd C:\Program Files\MongoDB\bin net start MongoDB mongomacOS 或 Linux 用mongod --dbpath /data/db # 另开一个终端 mongosh进 shell 后先看当前有哪些库show dbs你会看到admin、local、config三个系统库。admin存用户和权限local存本地数据config存分片信息。这三个别乱动。2.3 建库建集合芒果db 建库有个特点use一个不存在的库它不会立刻创建你得往里写点东西它才真正落地。use grade db.createCollection(class) show dbs这时候grade才会出现在列表里。查看当前库和集合db db.getName() show collections删除库和集合db.class.drop() db.dropDatabase()集合重命名db.class.renameCollection(class1)这里有个坑我踩过use grade之后直接show dbs看不到grade别慌插一条数据就出来了。另外集合名区分大小写class和Class是两个集合。3. 可复制配置把 TaoToken Key 和 MongoDB 连接写进 settings这一节给你可以直接复制的配置片段。核心思路是TaoToken 的 Base URL 和 Key 放在环境变量或配置文件里MongoDB 的连接串单独一份两者互不干扰但代码里能一起读。3.1 TaoToken 接入配置JSON 片段如果你用的是支持 OpenAI 兼容配置的工具settings.json里这样写{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的TaoTokenKey, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }三件套对齐Base URL 填https://taotoken.net/apiKey 填你刚创建的Model ID 填你要用的模型标识。这三个缺一不可少一个就会报鉴权或模型找不到的错。如果你用的是 Codex 那套auth.json里对应写{ base_url: https://taotoken.net/api, api_key: sk-你的TaoTokenKey, model: gpt-4o }3.2 MongoDB 连接配置TOML 片段Python 项目里我习惯用 TOML 管配置[mongodb] uri mongodb://localhost:27017 database grade collection class [taotoken] base_url https://taotoken.net/api api_key sk-你的TaoTokenKey model claude-sonnet-4-202505143.3 用 Python 把两边串起来装 pymongopip install pymongo连接并插入一条模型调用记录import pymongo from datetime import datetime # 连 MongoDB conn pymongo.MongoClient(mongodb://localhost:27017) db conn.grade myset db.class1 # 插入一条调用元数据 record { model: claude-sonnet-4-20250514, base_url: https://taotoken.net/api, called_at: datetime.now(), tokens_used: 1024, status: success } myset.insert_one(record) # 查回来看看 for doc in myset.find({status: success}): print(doc) conn.close()这段代码跑通说明 MongoDB 连接和写入都没问题。注意insert_one是 pymongo 的写法shell 里是insert别混。4. 验证请求与 CRUD 完整操作结果校验配置写完不算完得验证。这一节把芒果db 的增删改查完整走一遍每一步都给校验动作。4.1 插入文档并校验shell 里插入单条db.class1.insert({name: HanMei, age: 17, sex: w}) db.class1.find()插入多条db.class1.insert([ {name: 阿宝, age: 32}, {name: 阿哲, age: 31}, {name: 阿蓉, age: 26} ])校验动作find()返回的文档里每条都该有_id。如果你自己写了_id且重复insert会报错这时候用save可以覆盖db.class1.save({_id: 1, name: Lily, age: 13})save在_id存在时是修改不存在时是插入。insert遇到重复_id直接报错。4.2 查询与条件筛选查全部db.class1.find() db.class1.find({}, {_id: 0, name: 1, age: 1})field参数里1 表示显示0 表示不显示。除了_id其他字段的 0 和 1 不能混用。比较操作符db.class1.find({age: {$gt: 15}}, {_id: 0}) db.class1.find({age: {$gte: 15, $lte: 30}}, {_id: 0}) db.class1.find({age: {$ne: 13}}, {_id: 0}) db.class1.find({age: {$in: [11, 12, 13]}}, {_id: 0})逻辑操作符db.class1.find({$and: [{age: {$gt: 13}}, {sex: w}]}, {_id: 0}) db.class1.find({$or: [{age: {$gt: 30}}, {sex: m}]}, {_id: 0}) db.class1.find({age: {$not: {$gt: 15}}}, {_id: 0})数组相关db.class3.find({score: {$all: [64, 75]}}, {_id: 0}) db.class3.find({score: {$size: 3}}, {_id: 0}) db.class3.find({}, {_id: 0, score: {$slice: 2}})结果处理函数db.class1.find().pretty() db.class1.find().limit(3) db.class1.find().skip(3) db.class1.find({sex: m}).count() db.class1.find().sort({age: 1, name: 1}) db.class1.distinct(age)校验动作count()的数字应该和你插入的条数对得上。sort({age: -1}).limit(3)应该返回年龄最大的三条。4.3 更新文档db.class1.update({name: HanMei}, {$set: {age: 18}}) db.class1.update({name: Jame}, {$set: {age: 18}}, true) db.class1.update({sex: w}, {$set: {name: 小芳}}, false, true)四个参数query、update、upsert、multi。upsert为 true 时查不到就插入multi为 true 时改所有匹配的。修改器db.class1.update({}, {$inc: {age: 1}}, false, true) db.class1.update({name: Tom}, {$mul: {age: 2}}) db.class1.update({}, {$max: {age: 20}}, false, true) db.class1.update({}, {$min: {age: 25}}, false, true) db.class1.update({name: Jame}, {$unset: {sex: }}) db.class1.update({}, {$rename: {sex: gender}}, false, true)数组修改器db.class3.update({name: 小明}, {$push: {score: 5}}) db.class3.update({name: 小红}, {$pushAll: {score: [5, 10]}}) db.class3.update({name: 小红}, {$pull: {score: 10}}) db.class3.update({name: 小明}, {$pullAll: {score: [67, 5]}}) db.class3.update({name: 小明}, {$push: {score: {$each: [5, 10]}}}) db.class3.update({name: 小红}, {$addToSet: {score: 87}}) db.class3.update({name: 小红}, {$pop: {score: -1}})校验动作$inc之后重新find一次年龄应该都加了 1。$addToSet加已存在的值不会重复插入这点和$push不同。4.4 删除文档db.class2.remove({name: 阿蓉}) db.class0.remove({age: 17}, true) db.class2.remove({})justOne为 true 只删第一条默认 false 删所有。remove({})清空集合但保留集合本身。4.5 用 TaoToken 验证模型调用并落库把模型调用结果写进 MongoDB形成闭环import pymongo import requests from datetime import datetime conn pymongo.MongoClient(mongodb://localhost:27017) db conn.grade myset db.class1 resp requests.post( https://taotoken.net/api/v1/chat/completions, headers{ Authorization: Bearer sk-你的TaoTokenKey, Content-Type: application/json }, json{ model: claude-sonnet-4-20250514, messages: [{role: user, content: 用一句话解释 MongoDB}] } ) result resp.json() myset.insert_one({ model: claude-sonnet-4-20250514, reply: result[choices][0][message][content], called_at: datetime.now(), status: success }) for doc in myset.find({status: success}).sort(called_at, -1).limit(1): print(doc[reply]) conn.close()校验动作打印出来的reply应该是模型返回的内容同时 MongoDB 里多了一条记录。如果resp.status_code不是 200先看 Key 和 Base URL 对不对。5. 本篇常见报错排查401、local proxy failed、reading choices这一节把接入和操作过程中最容易撞上的几个报错拆开讲每个都给定位方法和修复动作。5.1 401 Unauthorized现象请求 TaoToken 接口返回 401或者 MongoDB 开了鉴权后连接被拒。TaoToken 侧 401 通常是 Key 问题。检查三件事Key 有没有复制完整前后不能有空格、Base URL 是不是https://taotoken.net/api、请求头是不是Authorization: Bearer sk-xxx。我见过有人把 Key 写进ANTHROPIC_AUTH_TOKEN却忘了Bearer前缀也会 401。MongoDB 侧 401 是鉴权失败。如果你给库加了用户连接串要带账号密码conn pymongo.MongoClient(mongodb://user:passlocalhost:27017/grade?authSourceadmin)authSource指向存用户的那个库通常是admin。漏了这个参数即使用户名密码对也会认证失败。5.2 local proxy failed现象请求发不出去报local proxy failed或连接超时。这个报错一般是本地网络配置或代理设置导致的。先检查环境变量里有没有残留的HTTP_PROXY、HTTPS_PROXY有的话临时清掉unset HTTP_PROXY unset HTTPS_PROXY然后确认https://taotoken.net/api能通。如果用的是公司网络可能有出口限制换一个网络环境再试。注意不要用任何非正规的网络工具合规访问即可。5.3 reading choices 报错现象KeyError: choices或reading choices相关报错。这个错说明返回的 JSON 里没有choices字段通常是请求本身失败了返回的是错误信息。定位方法先把原始返回打出来。print(resp.status_code) print(resp.text)常见原因模型 ID 写错比如把claude-sonnet-4-20250514写成claude-sonnet-4、请求体格式不对、或者 Key 没权限调这个模型。对照文档里的模型列表核对 Model ID三件套Base URL Key Model ID必须完全一致。5.4 OAuth 相关报错现象用 Claude Code 或类似工具时报 OAuth 认证失败。这类工具默认走 OAuth 登录如果你要接 TaoToken得改成 API Key 模式。在配置里把认证方式从 OAuth 切到 token填ANTHROPIC_AUTH_TOKEN而不是走登录流程。具体字段名看工具版本Claude Code 的配置在settings.json的env段里。5.5 MongoDB 连接被拒现象pymongo.errors.ServerSelectionTimeoutError。先确认mongod进程在跑ps aux | grep mongod再确认端口对默认 27017。如果改了端口连接串要跟着改。Windows 下服务没启动的话net start MongoDB再试。5.6 插入报 duplicate key error现象E11000 duplicate key error。说明_id重复了。芒果db 的_id必须唯一。要么换一个_id要么用save覆盖要么用update配合upsert。批量插入前先确认数据里没有重复的_id。6. 把统一 Key 和芒果db 用起来接入文档与后续动作走到这里你应该已经能连上 MongoDB、建库建集合、增删改查、把 TaoToken 的调用记录写进库、并且能定位几个常见报错。剩下的就是把它用进日常。几个实用技巧都是我实际用下来觉得省事的第一给常用查询建索引。比如你经常按model字段查调用记录就建一个db.class1.ensureIndex({model: 1}, {name: model_index}) db.class1.getIndexes()数据量小的时候索引收益不明显但记录攒到几万条查询速度差别就出来了。注意索引会拖慢写入插入频繁的场景别建太多。第二用聚合做统计。比如统计每个模型的调用次数db.class1.aggregate([ {$group: {_id: $model, count: {$sum: 1}}}, {$sort: {count: -1}} ])这条管道先按model分组计数再按次数降序。结果直接告诉你哪个模型用得最多。第三固定集合存日志。调用日志这种只关心最近一段时间的场景用固定集合db.createCollection(call_log, {capped: true, size: 100000, max: 1000})超过 1000 条或超过 100KB最早的记录自动淘汰不用手动清理。第四把 Key 从代码里挪出去。别把sk-xxx硬编码在.py文件里用环境变量或配置文件读。MongoDB 里存的应该是模型标识和调用元数据不是明文 Key。后续你要查 TaoToken 的接入细节去文档页https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。要新建或管理 Key去 API Keys 页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。想先在网页里试模型去模型对话页https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。长期跑编码任务或 Agent看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后留一个练习把前面学的串起来在grade库里建一个api_calls集合插入 5 条不同模型的调用记录字段包括model、tokens_used、called_at、status。然后查出status为success且tokens_used大于 500 的记录按tokens_used降序排列只显示model和tokens_used两个字段。做完这条芒果db 的基本操作你就真的拿下了。