最近放下了算法的学习,重新拾起了开发。刚好想搞点小玩意,因为学算法暂时搁置了。思来想去觉得用Mongodb这个数据库更好一点,query的数据刚好是一个json,而nodejs对json的支持堪称完美。

因为初次使用这个模块,所以简单的实现了一下Mongodb的CURD

刚开始按照自上而下的顺序写的时候发现顺序并不是我想要的,查询的时候查到了空数组。这说明了什么,异步问题,代码不能保证执行顺序,虽然相差不大,但刚好不是我们想要的顺序,而且随着业务的问题,一次操作的数据可能非常大,那样对于顺序的把控更加不可靠了,那么应该怎么办呢

ES6有两个新特性,一个是Promise对象,一个async函数。Promise可以简化代码,让你的代码脱离回调地狱,毕竟这种俄罗斯套娃式的代码任谁看了都不好受。async是对异步操作的一种改进。
具体的可以看看这个ES6 入门教程

当然,安装部分就不给出了,这个有手就行,百度一下你就知道

这里只实现了插入查询操作,余下的感兴趣的小伙伴可以看看菜鸟教程

const { MongoClient } = require("mongodb");

const dbName = "test";
const uri = "mongodb://localhost:27017/" + dbName;

// 这里按照官方3.x示例更改了一下

const client = new MongoClient(uri, {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

// 与 MySQL 不同的是 MongoDB 会自动创建数据库和集合,所以使用前我们不需要手动去创建。所以建立连接的时候直接指定数据库和集合即可
// 在这里我们使用ES6语法,它有很多很好用的新特性,比如接下来我们要用到的async,await,Promise,箭头函数,let,const等
// 因为我们这些操作都是写在一个函数里,所以每一次操作之后就不断开连接了,这样就挺麻烦的。但是在写项目的时候,对于数据库的操作一般都是在接口上,所以我们每次操作完之后记得释放资源,如果封装的模块会自动释放那最好


// 连接数据库
async function connectDb(client, dbName) {
    return new Promise(async function (resolve, reject) {
        await client.connect();
        let database = client.db(dbName);
        resolve(database);
    });
}

// 这个可有可无,最好就不要写,因为可能重复创建,会报错,直接连接就行,或者自己手动创建,因为它不能像MySQL那样去检测是否存在
// async function createColl(database , collName) {
//     return new Promise((resolve , reject) => {
//         database.createCollection(collName , (err , res) => {
//             if (err) reject(err);
//             resolve();
//         });
//     })
// }

// 连接集合
function connectColl(database, collName) {
    return new Promise((resolve, reject) => {
        let collObj = database.collection(collName);
        resolve(collObj);
    });
}

// 插入一条数据
function insert(collObj, obj) {
    return new Promise((resolve, reject) => {
        collObj.insertOne(obj, (err, res) => {
            if (err) reject(err);
            resolve();
        });
    });
}

// 插入多条数据
function insertM(collObj, arr) {
    return new Promise((resolve, reject) => {
        collObj.insertMany(arr, (err, res) => {
            if (err) reject(err);
            resolve();
        });
    });
}

// 查找数据
function findData(collObj, obj) {
    return new Promise((resolve, reject) => {
        // 将返回的数据转换为数组
        let res = collObj.find(obj).toArray();
        if (!res) reject("Not Found!");
        else resolve(res);
    });
}

async function run() {
    try {
        let database = await connectDb(client, dbName);
        let collName = "testColl";
        //await createColl(database , collName);
        let collObj = await connectColl(database, collName);

        // mongodb默认_id为主键,不设置的话会自动帮你加上
        let obj = {
            _id: "001",
            name: "张三",
            sex: "Female"
        };

        await insert(collObj, obj);

        let arr = [
            {
                _id: "002",
                name: "王五",
                sex: "Female"
            },
            {
                _id: "003",
                name: "李四",
                sex: "Male"
            }
        ];
        await insertM(collObj, arr);

        // 为空对象时相当于MySQL中的select * from XXX
        let result = await findData(collObj, {});
        console.log(result);

        let query = { name: '李四' };
        result = await findData(collObj, query);
        console.log(result);

    } finally {
        // 关闭连接
        await client.close();
    }
}

// 这个catch是Promise对象的一个方法,用于捕捉错误,也就相当于try/catch
// console.dir()可以显示一个对象所有的属性和方法。
run().catch(console.dir);