mongodb - 从 Mongo 获取 BinData UUID 作为字符串

我目前有一些 id 作为 UUID 存储在 Mongo 中(处理所必需的)。他们得到这样的返回:

"_id" : new BinData(3, "JliB6gIMRuSphAD2KmhzgQ==")

有什么简单的方法可以将此值转换为字符串以进行调试?

要明确一点 - 应用程序可以很好地处理数据。我只需要一种快速从 Mongo 获取实际 UUID 的方法。

最佳答案

您的问题的答案比您预期的要复杂!它复杂的主要原因是由于历史原因(不幸的是)不同的驱动程序使用不同的字节顺序将 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

可以通过在命令行上提供文件名(以及 --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 上进行标准化。同时,您必须使用与您正在使用的任何驱动程序相匹配的适当帮助函数。

https://stackoverflow.com/questions/8244110/

相关文章:

mongodb - 如何限制 mongodb 中更新文档的数量

mongodb - 如何使用 mongodump 转储匹配特定日期范围的记录?

javascript - 通过 JavaScript 直接访问 MongoDB

mongodb - 如何将元素插入 MongoDB 内部列表?

node.js - 处理 Mongoose 验证错误——在哪里以及如何处理?

mongodb - 如何在 Mongodb 的字段中查找子字符串

arrays - 更新 mongodb 中的嵌套数组

java - Mongo - 忽略属性被持久化

mongodb - 使用新的 _id 在 MongoDB 中复制文档

node.js - 如何在 MongoDB collection.find() 上获取回调