提问人:user3075373 提问时间:6/12/2015 更新时间:6/13/2015 访问量:5397
MongoDB仅使用中间件插入UUID?
MongoDB insert UUID only using middleware?
问:
我不知道如何正确地将UUID插入MongoDB。
例如:
db.users.insert({ uuid: UUID(buffer) })
缓冲区必须是 32 十六进制字符串,MongoDB 本机不创建 UUID,只存储这个?我说得对?但是在我创建随机 UUID 的地方,例如通过 Node.js 中间件,我有一个随机 UUID 11986aba-7c5a-4626-b354-80be23c25516,所以它是一个 36 长度的字符串,现在我不能把它放在 .我应该如何处理从node.js uuid模块生成的UUID?以后如何从MongoDB中读取这些插入的值作为普通的uuid字符串?UUID(buffer)
答:
6赞
Sylvain Leroux
6/13/2015
#1
BSON,因此 MongoDB 支持 UUID 类型。在 Mongo Shell 中,您可以使用构造函数将 32 位十六进制字符串转换为 UUID 内部表示形式。UUID()
从 node.js 中,使用该模块可以轻松生成 v1 或 v4 UUID 并将它们存储在缓冲区对象中:node-uuid
> my_uuid = uuid.v4(null, new Buffer(16))
<Buffer 91 ed c3 f0 20 36 4b f3 94 0c d3 d6 b0 a9 de 03>
然后,您可以将其转换为类型 4 二进制文件(或已弃用的类型 3):SUBTYPE_UUID
SUBTYPE_UUID_OLD
> collection.insert({uuid: mongodb.Binary(my_uuid, mongodb.Binary.SUBTYPE_UUID)},
function(err, result) { /* ... */ })
从 Mongo Shell 中,您可以按以下方式返回该值:
> db.test.find()
{ "_id" : ObjectId("557b2a390c59394b35236dc9"), "uuid" : BinData(4,"ke3D8CA2S/OUDNPWsKneAw==") }
请注意,Mongo Shell UUID()
函数将生成一个类型 3 二进制文件:SUBTYPE_UUID_OLD
> db.test.insert({uuid:UUID('09352d90756741879c25e108d83290a2')})
{ "_id" : ObjectId("557b2acc0c59394b35236dcb"), "uuid" : BinData(4,"ke3D8CA2S/OUDNPWsKneAw==") }
{ "_id" : ObjectId("557b2b7984ee2ba0375f4fc9"), "uuid" : BinData(3,"CTUtkHVnQYecJeEI2DKQog==") }
// ^
评论
0赞
user3075373
6/13/2015
谢谢,实际上我解决了我的问题。我认为删除连字符这个函数会更好,这会将新生成的 UUID 返回为二进制数据,这很重要,因为 MongoDB 有一个本机函数,可以将此值从缓冲区转换为 MongoDB bin 数据。docs.mongodb.org/manual/reference/method/UUID 存储 UUID 作为二进制值提供比字符串更好的性能。uuid.v4(null, new Buffer(16)) // => <Buffer 09 35 2d 90 (...) >
UUID(32byteHex)
0赞
user3075373
6/13/2015
当然,但我在这里投票没有名声。:(
0赞
Sylvain Leroux
6/13/2015
@user3075373 我已经使用您提供的信息编辑了我的答案。现在好多了吗?
0赞
user3075373
6/13/2015
是的!实际上,我认为这是在MongoDB中存储UUID的最佳方式。:)
评论