提问人:Robert Gonciarz 提问时间:10/19/2023 最后编辑:Robert Gonciarz 更新时间:10/19/2023 访问量:19
MongoDB:转换和连接数组中的 UUID
MongoDB: convert and concat UUIDs in an array
问:
上下文:根据配置文件数组条目中的字段,我可能会投影几个不同的链接。 为了节省空间,我希望能够在聚合的投影阶段生成它们。
我有以下文件:
{
"_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 存储为字符串的解决方法,但也许有更优雅的方法可以做到这一点。
答: 暂无答案
评论