Mongodb 来自Mongo shell的Mongo UUID类型03而不是04
来自MongoShell的MongoDB UUID转换结果是03类型,传统格式。我们如何让它与类型04,二进制格式一起工作Mongodb 来自Mongo shell的Mongo UUID类型03而不是04,mongodb,mongodb-query,mongo-shell,Mongodb,Mongodb Query,Mongo Shell,来自MongoShell的MongoDB UUID转换结果是03类型,传统格式。我们如何让它与类型04,二进制格式一起工作 > db.foo.insert({"_id":1000,"key1":UUID("240003A09CEC456AB57B98FF8E0E45DB")}) WriteResult({ "nInserted" : 1 }) > db.foo.find({_id:1000}) { "_id" : 1000, "key1" : BinData(3,"JAADo
> 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代码中,我们可以使用bytebuffers并将其作为类型04二进制uuid插入,示例:BinData(4,“XWCwWqIVTfiEkTx9Yl+2UQ==”) 通过提取base64编码并提供它,您可以将数据作为类型4直接放入
BinData()
函数中:
var t = BinData(4, UUID("240003a09cec456ab57b98ff8e0e45db").base64())
BinData(4,"JAADoJzsRWq1e5j/jg5F2w==")
然后您仍然可以从hex获得提供的值:
t.hex()
240003a09cec456ab57b98ff8e0e45db
或者直接提供给HexData()
:
如果数据中有连字符,请使用和重新格式化:
var str = "240003A0-9CEC-456A-b57B-98FF8e0E45DB";
str.split('-').join("").toLowerCase();
"240003a09cec456ab57b98ff8e0e45db"
存在JIRA票证,使
UUID()
生成类型4作为默认值,但这是一个低优先级问题。对于一般用途,您的交互应该是基于“驱动程序”的。但是有这些方法可以使用shell。谢谢您的帮助。只是好奇,为什么UUID()函数仍然保留为旧的遗留格式?是否可以添加一个选项类型来表示类型04。@dilsingi一直都是这样,我不知怎么地没有看到外壳发生变化。可能有一张JIRA票,但作为一个“实用工具”,它不会是一个高优先级。如前所述,shell中有HexData
,以及在不同类型之间移动数据的演示方法。主要支持“驱动程序”实现,对于任何工业用途,您都应该使用它。@dilsingi添加了JIRA问题以供参考。但如上所述,这是低优先级的。使用shell时,请使用所示的方法。再次感谢。注意到文档中有一些数据使用“-”分隔符。当使用HexData db.foo.insert({“_id”:1002,“key1”:HexData(4,'AC1AAB22-0BF9-4127-BDC2-9C11398130AE'))2017-07-01T19:10:41.286-0500E查询[thread1]错误:字符串中的十六进制字符无效:@(shell):1:34。我道歉了,没注意到我原来的剧本。迪尔辛基甚至在连字符被删除的情况下,还能用什么技巧来转换它们呢。您可以使用.split()
和.join()
JavaScript函数去除连字符。但数据必须是有效的。事实并非如此。如果你有一个新问题
var str = "240003A0-9CEC-456A-b57B-98FF8e0E45DB";
str.split('-').join("").toLowerCase();
"240003a09cec456ab57b98ff8e0e45db"