从Mongo获取BinData UUID作为string

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

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

将这个值转换成string进行debugging的简单方法是什么?

只是要清楚 – 应用程序可以处理的数据罚款。 我只需要一种方法来快速从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的内置函数,您可以使用该函数将二进制值显示为hexstring:

 > var doc = db.test.findOne() > doc._id.hex() 33221100554477668899aabbccddeeff > 

仔细查看:hexstring的字节顺序与C#程序中使用的原始UUID值不匹配。 这是因为C#驱动程序使用Guid类的Microsoft ToByteArray方法返回的字节顺序(遗憾地,按照奇怪的顺序返回字节,这个事实在很多个月中都没有发现)。 其他司机有自己的特质。

为了解决这个问题,我们有一些用JavaScript编写的帮助函数可以加载到Mongo shell中。 他们在这个文件中被定义:

https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js

可以通过在命令行中提供文件的名称(以及–shell参数)来告诉Mongo shell在启动时处理文件。 加载这个文件后,我们可以访问一些辅助函数来创build和显示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#驱动程序的字节sorting约定为一个UUID创build一个BinData值,以便我们可以查询一个UUID。 其他驱动程序也有类似的function(toJUUID,toPYUUID,JUUID,PYUUID)。

将来的某一天,所有的驱动程序都将使用标准的字节顺序对新的二进制子types4进行标准化。 在此期间,您必须使用与您所使用的驱动程序相匹配的适当帮助函数。

在查询之前使用这个函数:

 function ToGUID(hex) { var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2); var b = hex.substr(10, 2) + hex.substr(8, 2); var c = hex.substr(14, 2) + hex.substr(12, 2); var d = hex.substr(16, 16); hex = a + b + c + d; var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12); return '"' + uuid + '"'; } var id = new BinData(3, "JliB6gIMRuSphAD2KmhzgQ=="); ToGUID(id.hex()); 

结果: "ea815826-0c02-e446-a984-00f62a687381"