将字符串字段转换为 MongoDB 中的编码字符串

Posted

技术标签:

【中文标题】将字符串字段转换为 MongoDB 中的编码字符串【英文标题】:Convert String field to an Encoded String in MongoDB 【发布时间】:2021-11-09 23:20:08 【问题描述】:

我的要求是编写一个 Mongo 聚合,通过对集合中的一些现有“实际”文档进行分组,返回一个“虚拟”文档列表。

我打算在我的 UI 项目中按原样使用此结果,我正在寻找可以在聚合过程中为其添加唯一且可解码的 ID 的方法。

例子:

[   
    ... pipeline stages,
    
        $group: 
            _id: 
                bookCode: '$bookCode',
                bookName: '$bookName'
            
            books: 
                $push: '$bookId'
            
        
    ,
    
        $project: 
            //virtual unique Id by combining bookCode and bookName
            virtualId: 
                $concat: [
                    
                        $ifNull: [ '$_id.bookCode', '~' ]
                    ,
                    '-',
                    
                        $ifNull: [ '$_id.bookName', '~' ]
                    
                ]
            ,
            books: '$books'
        
    
]

样本输出:

[
    
        virtualId: 'BC01-BOOKNAME01'
        books: ['BID01', 'BID02']
    ,
    
        virtualId: 'BC02-BOOKNAME01'
        books: ['BID03', 'BID04']
    ,
    
        virtualId: '~-BOOKNAME01'
        books: ['BID05', 'BID06']
    ,
    
        virtualId: 'BC02-~'
        books: ['BID07', 'BID08']
    ,
    
        virtualId: '~-~'
        books: ['BID09', 'BID10']
    ,
]

这种连接分组字段以生成virtualId 的方法有效,但有没有办法让它更简洁? 也许我可以通过某种方式将其转换为人类无法读取但可解码的格式。

TLDR:我正在寻找在聚合查询本身中为每个结果文档创建 ID 的方法,如果我稍后对其进行解码,它将返回它的贡献字段。 MongoDB 版本:4.0.0

【问题讨论】:

请提供样本数据 @mohammadNaimi,我添加了一个示例输出。希望对您有所帮助。 你想要代码 id 为 base64 还是类似的东西? @mohammadNaimi,是的,这行得通,我一直在尝试找到一个示例,但找不到。 【参考方案1】:

使用这个聚合我们使用函数并用js函数生成代码

db.collection.aggregate([
  
    "$project": 
      books: 1,
      virtualId: 
        "$function": 
          "body": "function(a)var t = '';for(i=0;i<a.length;i++)t=a.charCodeAt(i)+t;;return t;",
          "args": [
            "$virtualId"
          ],
          "lang": "js"
        
      
    
  
])

https://mongoplayground.net/p/Lm_VjIG54BG

【讨论】:

这适用于 mongodb 4.4+。有没有办法为 v4.0.0 做类似的事情?

以上是关于将字符串字段转换为 MongoDB 中的编码字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MongoDB 中的属性从文本类型转换为日期类型?

将 Mongodb 中的日期与 C# LINQ 驱动程序进行比较

雪花:将字段编码转换为 UTF8

将对象数组转换为mongodb中的字符串数组

使用 SQL 将字符串列转换为 mongodb 中的日期时间

将 InputStream 转换为 base64 字符串