MongoDB 4.0聚合场景下生成可解码非明文唯一virtualId的方法
方案1:保持明文逻辑,精简写法
你现有实现已经是MongoDB 4.0版本下最简洁的明文virtualId生成逻辑,仅需移除多余注释、关闭不需要返回的_id字段即可得到最简写法,和原有逻辑、输出结果完全一致:
[ {... 前置pipeline阶段}, { $group: { _id: { bookCode: '$bookCode', bookName: '$bookName' }, books: { $push: '$bookId' } } }, { $project: { _id: 0, virtualId: { $concat: [ { $ifNull: [ '$_id.bookCode', '~' ] }, '-', { $ifNull: [ '$_id.bookName', '~' ] } ] }, books: 1 } } ]
方案2:生成不可读但可解码的virtualId
MongoDB 4.0内置$stringToHex运算符,可将明文字符串转为十六进制编码格式,人类无法直接识别,但可通过十六进制转字符串操作1:1还原原始值,完全满足需求,实现代码如下:
[ {... 前置pipeline阶段}, { $group: { _id: { bookCode: '$bookCode', bookName: '$bookName' }, books: { $push: '$bookId' } } }, { $project: { _id: 0, virtualId: { $stringToHex: { $concat: [ { $ifNull: [ '$_id.bookCode', '~' ] }, '-', { $ifNull: [ '$_id.bookName', '~' ] } ] } }, books: 1 } } ]
解码规则
需要还原字段值时,仅需将virtualId的十六进制字符串转为普通字符串,再按-拆分即可,拆分后的值为~就对应原始字段为空。比如样本中BC01-BOOKNAME01转十六进制后为424330312d424f4f4b4e414d453031,解码后可100%还原原始值。
内容的提问来源于stack exchange,提问作者Prashant Vishwakarma
相关产品推荐
相关产品推荐

