如何在Cosmos DB文档中添加面向终端用户的简易友好ID字段
Cosmos DB 自定义用户友好ID字段解决方案
结论
完全可以实现,无需修改Cosmos DB自动生成的默认id字段,仅需新增自定义字段(如你示例中的ref)即可满足终端用户识别、检索工单的需求。
主流实现方案
方案1:应用层生成后写入(最常用,适配工单系统场景)
这是成本最低、灵活度最高的实现方式,核心逻辑如下:
- 生成规则:生成6~8位的易读字符串,建议剔除易混淆字符(
0和O、1和I、l等),仅保留大写字母+数字组合,和你示例的45H7GI格式一致。 - 唯一性校验:写入文档前先查询目标容器是否存在重复的
ref值,如果你是多租户工单系统,仅需校验同tenantId下ref唯一即可,无需全局唯一,可大幅降低校验成本。 - 示例生成逻辑(Python):
import random import string # 剔除易混淆字符的字符集 CHAR_SET = string.ascii_uppercase.replace('O', '').replace('I', '') + string.digits.replace('0', '').replace('1', '') def generate_ref(length=6): return ''.join(random.choice(CHAR_SET) for _ in range(length))
方案2:Cosmos DB服务端预触发自动生成
如果不想修改应用层写入逻辑,可以使用Cosmos DB的预触发功能,在文档写入前由服务端自动生成ref字段并写入:
- 提前在Cosmos DB容器中创建预触发脚本,逻辑和上述应用层生成逻辑一致,写入前完成
ref生成和唯一性校验。 - 应用端每次写入文档时,指定触发对应的预触发即可,无需额外改造业务逻辑。
方案3:生成带有序号的规整ID(可选)
如果希望ref字段带有序号属性(如TKT001234),可以单独维护一个计数器文档存储当前工单序号,每次写入新工单前先读取并递增计数器,用生成的序号拼接前缀作为ref值,适合需要有序工单编号的场景。
优化建议
- 给
ref字段添加索引,多租户场景建议创建tenantId+ref的复合索引,可大幅降低用户检索时的RU消耗,提升查询速度。 - 高并发场景下可以使用Base58编码压缩UUID生成
ref,冲突概率极低,可省略唯一性校验步骤,提升写入效率。 - 最终用户查询工单时,直接使用
SELECT * FROM c WHERE c.ref = '用户提交的编号' AND c.tenantId = '当前租户ID'即可,无需使用系统默认的长id字段。
内容的提问来源于stack exchange,提问作者user3257023
相关产品推荐
相关产品推荐

