mongodb nodejs一个有自增id的功能

需求描述:

需要用MongoDB Client ,Node.js , TypeScript 来做一个注册表功能。

要保证玩家的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(MongoDBManager.mongoInfo.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

猜你喜欢

转载自www.cnblogs.com/music-liang/p/12762362.html
今日推荐