需求描述:
需要用MongoClient模块 ,TypeScript语言 来做一个注册表功能。
要保证玩家的userid 是自增的、唯一的。
注意:这不是关于MongoClient读写数据库的基础教程。(这方面基础知识,请百度 菜鸟教程)
这是一个真实案例。是关于如何在MongoDB里面,实现某个字段的自增长。。。例如玩家注册的时候,userid要保证唯一。
当前版本号:MongoDB shell version v4.2.5
官方对于API的解释:
http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findOneAndUpdate
对于 $inc 的解释:
https://docs.mongodb.com/manual/reference/operator/update/inc/#up._S_inc
https://mongodb.github.io/node-mongodb-native/api-articles/nodekoarticle1.html
/**1.连接数据库服务器*/ MongoClient.connect(url, function (err, dbClient) { //assert.equal(err, null); if (err) { MyUtil.outputErrorInfo("MongoDBManager", "userRegister", "register error"); console.error(err); objReturn.code = NetMessageID.ERROR_CODE.REGISTER_FAILED; objReturn.des = "注册失败,数据库有问题"; resolve(objReturn); dbClient.close(); return; } /**2.连接某个具体的数据库*/ const UserDB = dbClient.db(dbname); /**3.连接数据库的某个表*/ const registerCollection = UserDB.collection(table_register);
registerCollection.findOneAndUpdate( { increase: 1 }, { $inc: { userid: 1 }, $set: { des: "This line record total num" } }, { "upsert": true, "returnOriginal": false }, (err, res) => { if (err) { console.error(err); MyUtil.outputErrorInfo("MongoDBManager", "userRegister", "insert error"); console.error(err); objReturn.code = NetMessageID.ERROR_CODE.REGISTER_FAILED; objReturn.des = "注册失败,保存数据库失败,未知错误1"; objReturn.userid = 0; resolve(objReturn); dbClient.close(); return; } /**取出了递增的id值,把玩家userid字段赋值*/ oneUser.userid = MongoDBManager.g_BaseUserID + res.value.userid; /**插入我们的新数据 */ registerCollection.insertOne(oneUser, (err, res) => { if (err) { MyUtil.outputErrorInfo("MongoDBManager", "userRegister", "insert error"); console.error(err); objReturn.code = NetMessageID.ERROR_CODE.REGISTER_FAILED; objReturn.des = "注册失败,保存数据库失败,未知错误"; objReturn.userid = 0; resolve(objReturn); dbClient.close(); return; } }); /**如果一切正常,会走到这里.把userid值放入返回值,传递出去 */ objReturn.userid = oneUser.userid objReturn.code = NetMessageID.ERROR_CODE.IS_OK; objReturn.des = "注册成功"; MyUtil.outputErrorInfo("MongoDBManager.ts", "userRegister", `新玩家[${regist.username}]注册成功,userid:${objReturn.userid}`); resolve(objReturn); dbClient.close();
数据库效果图:
我们这里调用了2次 Mongo的函数。
1.调用findOneAndUpdate 函数。这个是原子操作,它始终只会读写第一条数据。每次主要目的就是记录自增值。
2.调用insertOne函数, 插入一条数据。。。我们是在 findOneAndUpdate 的回调中调用的,意思就是获取到自增的值之后,我们才知道真正的userid是都少,才正式把玩家的注册信息保存到数据库。
这些字段是什么意思,请参考前面贴出的连接的文章。
{ increase: 1 },{ $inc: { userid: 1 }, $set: { des: "This line record total num" } },{ "upsert": true, "returnOriginal": false }
最后,传送门,这是我的项目代码地址:https://github.com/liangzai90/websocket-server-and-client