需求描述:
需要用MongoClient模块 ,TypeScript语言 来做一个注册表功能。
要保证玩家的userid 是自增的、唯一的。
注意:这不是关于MongoClient读写数据库的基础教程。(这方面基础知识,请百度菜鸟教程)
这是一个真实案例。是关于如何在MongoDB里面,实现某个字段的自增长。。。例如玩家注册的时候,userid要保证唯一。
当前版本号:MongoDB shell version v4.2.5
官方对于API的解释:
对于 $inc 的解释:
/**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 }