【问题标题】:Convert String field to an Encoded String in MongoDB将字符串字段转换为 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,是的,这行得通,我一直在尝试找到一个示例,但找不到。

标签: mongodb mongodb-query nosql aggregation-framework aggregation


【解决方案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 做类似的事情?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多