最近放下了算法的学习,重新拾起了开发。刚好想搞点小玩意,因为学算法暂时搁置了。思来想去觉得用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);