zoukankan      html  css  js  c++  java
  • mongodb nodejs一个有自增id的功能

    需求描述:

    需要用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

  • 相关阅读:
    性能测试相关
    centos7 设置定时器 crond
    大杀器Bitset
    树形DP
    双线程DP
    状态压缩DP
    斜率优化DP
    01分数规划
    二分和三分
    uva11549 Floyd判圈法
  • 原文地址:https://www.cnblogs.com/music-liang/p/12762362.html
Copyright © 2011-2022 走看看