我需要使用包含 “遗留”UUID 对象 - BSON binData 子类型 3(使用 pymongo 创建)的 MongoDB 数据库。
MongoDB shell 版本 v5.0.15 可以使用旧的和“新的”UUID 对象:
> UUID("c19f6bdf-e680-4059-8b9a-a19bb879abb3") # BSON binData subtype 4
UUID("c19f6bdf-e680-4059-8b9a-a19bb879abb3")
> UUID("c19f6bdfe68040598b9aa19bb879abb3") # BSON binData subtype 3
BinData(3,"wZ9r3+aAQFmLmqGbuHmrsw==")
但是在 MongoDB 6.0 中,经典的
mongo
shell 消失了,新的 mongosh
不支持使用 UUID
构造函数创建遗留 UUID 对象:
> UUID("c19f6bdf-e680-4059-8b9a-a19bb879abb3")
UUID("c19f6bdf-e680-4059-8b9a-a19bb879abb3") # BSON binData subtype 4
> UUID("c19f6bdfe68040598b9aa19bb879abb3")
UUID("c19f6bdf-e680-4059-8b9a-a19bb879abb3") # also BSON binData subtype 4
有什么方法可以将新的 MongoDB 6.0 shell (
mongosh
) 切换为默认使用旧版 UUID?
动机是同事习惯于使用
UUID()
构造函数,现在可能会错误地使用新的 UUID 子类型创建文档,这可能会破坏应用程序逻辑。
我知道从长远来看,理想的解决方案是迁移我们的数据库以使用新的 UUID 对象(binData 子类型 4)。但这将是一个更长的过程,并且在迁移期间情况会更糟——一些数据库可能使用旧格式(子类型 3)而其他数据库使用新格式(子类型 4)。
它是一个简单的 HEX -> Base64 转换。试试这个:
db.testbin.insertOne({
uuid_data: BinData(3, "wZ9r3+aAQFmLmqGbuHmrsw=="),
bin_data: Binary(Buffer.from("c19f6bdfe68040598b9aa19bb879abb3", "hex"), 3),
})
db.testbin.find({})
[
{
_id: ObjectId("64623984839586cbe11d6a48"),
uuid_data: Binary(Buffer.from("c19f6bdfe68040598b9aa19bb879abb3", "hex"), 3),
bin_data: Binary(Buffer.from("c19f6bdfe68040598b9aa19bb879abb3", "hex"), 3)
}
]
您可以覆盖
UUID
函数(可能在.mongoshrc.js
文件中):
function UUID(val) {
return Binary(Buffer.from(val, "hex"), 3)
}
> UUID("c19f6bdfe68040598b9aa19bb879abb3")
Binary(Buffer.from("c19f6bdfe68040598b9aa19bb879abb3", "hex"), 3)