You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:06:04