预设的 ObjectId 范围太小,改用 UUID 来当数据的唯一 ID
如果你过去有过 Web 开发经验,到这边肯定会开始有一些疑问欲求解,第一个问题肯定是”ObjectId 的数量极限?”。笔者在此不会回答这问题,因为这答案并不重要,想要准确知道答案,可以去”
mongodb.org“寻找答案。
比起上述问题,相信你应该更想问:
预设的 ObjectId 适用的范围? 如果日后数据库要扩展(Scale),是否有其他的 ID 解决方案可使用?
一般情况, MongoDB 预设的 ObjectId 就相当够用了,但如果你是要建构大型的 Web Service 或是保留未来的扩充性,可使用 UUID 去代替 ObjectId。不过,因为 MongoDB 本身并不生成 UUID,若是要使用 UUID,就必需先自行产生好 UUID,然后在新增数据时指定生成好的 UUID 给 _id 字段,让 MongoDB 改用我们给的 ID 而不使用预设生成的 ObjectId。
因为要自行产生 UUID,必需先为 NodeJS 安装模块 node-uuid:
npm install uuid
然后生成 UUID 并在 insert 时使用:
var uuid = require('node-uuid'); var mongodb = require('mongodb'); var mongodbServer = new mongodb.Server('localhost', 27017, { auto_reconnect: true, poolSize: 10 }); var db = new mongodb.Db('mydb', mongodbServer); /* open db */ db.open(function() { /* Select 'contact' collection */ db.collection('contact', function(err, collection) { /* Generate UUID(16 Bytes) and convert to BinaryData object for mongodb */ var uuidBinary = new Buffer(uuid.v1({}, [])); var id = mongodb.BSONPure.Binary(uuidBinary, mongodb.BSONPure.Binary.SUBTYPE_UUID); /* Insert a data with uuid */ collection.insert({ _id: id, name: 'Fred Chien', email: 'cfsghost@gmail.com' }, function(err, data) { if (data) { console.log('Successfully Insert'); } else { console.log('Failed to Insert'); } }); }); });
你可能会发现,在上面的范例程序中,我们将 UUID 转成 MongoDB BSON 的 BinaryData 格式,这是为了效能考虑,因为用纯字符串当做 Unique ID,在数据库搜寻上会比 BinaryData Object 慢很多。