您问题的答案比您想象的更复杂!它复杂的主要原因是,由于历史原因(不幸的是),不同的驱动程序使用不同的字节顺序将 UUID 写入数据库。您没有提及您正在使用哪个驱动程序,但我将使用 C# 驱动程序作为示例。
假设我使用以下代码插入文档:
var guid = new Guid("00112233-4455-6677-8899-aabbccddeeff");
collection.Insert(new BsonDocument {
{ "_id", guid },
{ "x", 1 }
});
如果我然后使用 Mongo shell 检查该文档,它看起来像这样:
> db.test.findOne()
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>
Mongo shell 有一个名为 hex 的内置函数,您可以使用该函数将二进制值显示为十六进制字符串:
> var doc = db.test.findOne()
> doc._id.hex()
33221100554477668899aabbccddeeff
>
仔细看:十六进制字符串的字节顺序与 C# 程序中使用的原始 UUID 值不匹配。这是因为 C# 驱动程序使用 Microsoft 的 Guid 类的 ToByteArray 方法返回的字节顺序(遗憾的是,该方法以奇怪的顺序返回字节,这一事实已经好几个月没有被发现了)。其他司机也有自己的特点。
为了解决这个问题,我们有一些用 Javascript 编写的辅助函数,可以加载到 Mongo shell 中。它们在此文件中定义:
https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js
通过在命令行上提供文件名(以及 --shell 参数),可以告诉 Mongo shell 在启动时处理文件。加载此文件后,我们可以访问许多辅助函数来创建和显示 UUID 形式的 BinData 值。例如:
C:\mongodb\mongodb-win32-x86_64-2.0.1\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.1
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc._id.toCSUUID()
CSUUID("00112233-4455-6677-8899-aabbccddeeff")
> db.test.find({_id : CSUUID("00112233-4455-6677-8899-aabbccddeeff")})
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>
在此示例中,toCSUUID 函数用于将 BinData 值显示为 CSUUID,CSUUID 函数用于使用 C# 驱动程序的字节排序约定为 UUID 创建 BinData 值,以便我们可以查询 UUID。其他驱动程序(toJUUID、toPYUUID、JUUID、PYUUID)也有类似的功能。
将来的某一天,所有驱动程序都将采用标准字节顺序标准化新的二进制子类型 4。与此同时,您必须使用与您正在使用的任何驱动程序相匹配的适当的辅助函数。