如何在 mongo shell 中使用遗留 UUID?

问题描述 投票:0回答:1

我需要使用包含 “遗留”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)。

mongodb uuid mongo-shell
1个回答
0
投票

它是一个简单的 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)

 
© www.soinside.com 2019 - 2024. All rights reserved.