MongoDB:转换和连接数组中的 UUID

MongoDB: convert and concat UUIDs in an array

提问人:Robert Gonciarz 提问时间:10/19/2023 最后编辑:Robert Gonciarz 更新时间:10/19/2023 访问量:19

问:

上下文:根据配置文件数组条目中的字段,我可能会投影几个不同的链接。 为了节省空间,我希望能够在聚合的投影阶段生成它们。

我有以下文件:

{
    "_id": 123,
    "userName": "foo",
    "profiles": [
        {
            "profileId": 345,
            "hash": UUID("5273a20c-f506-4a54-aaf4-ae67a06028c5"),
        },
        {
            "profileId": 456,
            "hash": UUID("f540873f-b489-49b5-b027-ab92d91bea3c"),
        },
    ]
}

我想创建以下投影:

{
    "userName": "foo",
    "profiles": [
        {
            "linkA": "https://foo/profiles/345/full_5273a20cf5064a54aaf4ae67a06028c5",
            "linkB": "https://foo/profiles/345/summary",
        },
        {
            "linkA": "https://foo/profiles/456/full_f540873fb48949b5b027ab92d91bea3c",
            "linkB": "https://foo/profiles/456/summary",
        },
    ]

}

{
    "userName": "foo",
    "profiles": [
        "https://foo/profiles/345/full_5273a20cf5064a54aaf4ae67a06028c5",
        "https://foo/profiles/456/full_f540873fb48949b5b027ab92d91bea3c",
    ]

}

我试图建立一个投影,但我既无法连接也无法转换 UUID。有一个解决方法(下面使用 JS,但我不确定它是否有效)。这不是整个查询(只是转换部分):

db.getCollection('users').aggregate([
{ $match: {profiles: { $exists: true, $not: { $size: 0 }} }},
{ $project: {
    userName: 1,
    profiles: {
        $map: {
            input: "$profiles",

            // "code" : 16702, $concat only supports strings, not binData
            // in: {$concat: ["$$this.hash"]}

            // "code" : 241, Unsupported conversion from binData to string in $convert with no onError value
            // in: { $toString: "$$this.hash" }

            // solution from: https://stackoverflow.com/questions/76804105/mongodb-convert-uuid-to-string-in-projection
            in: {
                "$function": {
                "body": "function convert(s){let t=s.hex();var r=t.substr(6,2)+t.substr(4,2)+t.substr(2,2)+t.substr(0,2),u=t.substr(10,2)+t.substr(8,2),b=t.substr(14,2)+t.substr(12,2),e=t.substr(16,16);return t=r+u+b+e,t.substr(0,8)+'-'+t.substr(8,4)+'-'+t.substr(12,4)+'-'+t.substr(16,4)+'-'+t.substr(20,12)}",
                "args": [
                    "$$this.hash"
                ],
                "lang": "js"
                }
            }

        }
    },
},
}
])

我在这里准备了一个游乐场:https://mongoplayground.net/p/XG-PO9Sxve3 但如果这是内部 UUIDv4 表示,我不是 100%。

这是我在 mongosh 中看到另一个文档的方式:

(...)
profiles: [
    {
      profileId: Long("41060024"),
      hash: new UUID("af7a0e53-1cba-ca19-ef07-cffc5e9bad17"),
      createdAt: ISODate("2023-09-25T21:41:30.451Z")
    }
  ] 

你有什么建议如何正确地做到这一点吗?

我在这里看到了类似的问题/答案:MongoDb,将 UUID 转换为字符串,在投影中

游乐场: https://mongoplayground.net/p/dKxx2gWmooQ

我不认为这是正确的方法。至于现在,我看到了一种将 UUID 存储为字符串的解决方法,但也许有更优雅的方法可以做到这一点。

MongoDB UUID 投影

评论


答: 暂无答案