从Mongo shell中使用Mongo UUID类型03而不是04

3

MongoDB UUID转换成Mongo Shell的格式是TYPE 03,这是遗留的格式。我们如何将其转换为TYPE 04,即二进制格式?

> db.foo.insert({"_id":1000,"key1":UUID("240003A09CEC456AB57B98FF8E0E45DB")})
  WriteResult({ "nInserted" : 1 })
> db.foo.find({_id:1000})
  { "_id" : 1000, "key1" : BinData(3,"JAADoJzsRWq1e5j/jg5F2w==") }
> db.version()
  3.4.2

通过Java代码,我们可以使用字节缓冲区,并将其插入为类型04的二进制UUID,例如:BinData(4,“XWCwWqIVTfiEkTx9Yl+2UQ==”)。

1个回答

7

您可以将数据直接放入BinData()函数中作为类型4,方法是提取base64编码并提供它:

var t = BinData(4, UUID("240003a09cec456ab57b98ff8e0e45db").base64())
BinData(4,"JAADoJzsRWq1e5j/jg5F2w==")

然后你仍可以从十六进制获取提供的值:

t.hex()
240003a09cec456ab57b98ff8e0e45db

或者直接提供给HexData()

HexData(4,"240003a09cec456ab57b98ff8e0e45db")
BinData(4,"JAADoJzsRWq1e5j/jg5F2w==")

如果您的数据中间有连字符,请使用 .split().join() 进行重新格式化:
var str =  "240003A0-9CEC-456A-b57B-98FF8e0E45DB";
str.split('-').join("").toLowerCase();
"240003a09cec456ab57b98ff8e0e45db"

存在一个 JIRA 票据来使 UUID() 生成类型4作为默认值 SERVER-12835,但这是一个低优先级的问题。对于一般使用,您的交互应该基于“驱动程序”。但有这些方法可以在 shell 中使用。


感谢您的帮助。只是好奇,为什么UUID()函数仍然保留旧的遗留格式?是否可以添加选项类型以表示类型04? - dilsingi
@dilsingi,一直都是这样的,我不太看到Shell会改变。可能有一个JIRA票据,但作为“实用程序”,它不会是高优先级的。正如所指出的,从Shell中有HexData以及演示了在不同类型之间移动数据的方法。主要的支持更多是面向“驱动程序”实现,对于任何工业目的,你应该使用它们。 - Neil Lunn
@dilsingi 已添加 JIRA 问题以供参考。但是如所述,这是低优先级的。在从 shell 工作时,请使用所示方法。 - Neil Lunn
再次感谢。注意到文档中有一些带“-”分隔符的数据。使用HexData db.foo.insert({"_id":1002,"key1":HexData(4,'AC1AAB22-0BF9-4127-BDC2-9C11398130AE')}) 时会出错。2017-07-01T19:10:41.286-0500 E QUERY [thread1] Error: Invalid hex character in string : @(shell):1:34. 对此表示歉意,原始脚本中我忽略了它们。有什么技巧可以转换它们吗? - dilsingi
@dilsingi 即使去掉连字符,这不是一个有效的值。您可以使用 .split().join() JavaScript 函数去除连字符。但数据确实需要有效。这不是有效的。如果您有新问题,请提出新问题 - Neil Lunn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接