【重学Node.js 第3篇】mongodb以及mongoose的使用
mongodb以及mongoose的使用
本篇为这个系列的第三篇,想看更多可以直接去github的项目:https://github.com/hellozhangran/happy-egg-server
更多介绍可以看:https://www.cnblogs.com/zhangran/p/11963616.html
mongodb
mongodb是典型的非关系型数据库,关于它的背景介绍和优势劣势这里就不赘述,我们直接讲实操或者说最有可能用到的部分。
mongodb常用指令
mongod --config /opt/mongodb/mongod.conf
启动mongod服务。- 如果想在后台启动,需要修改mongod.conf,添加fork=true,然后再启动。
- 想关掉后台运行的mongod服务,先查看所有后台运行的服务
lsof -i
,找到mongod的pid号,kill yourpid
mongo
进入 mongo 环境show dbs
查看所有的数据库use test
进入test数据库db.createCollection(‘user‘)
创建一个user
集合- 这里简单介绍一下集合的概念,mongo 是非关系型数据库,不存在表的概念,与表相对应的是集合。当然集合不是表,与表相差很大,没有表的行列结构,可以简单的把集合当成一个 list,而 list 里面会放一个个对象。有没有发现这像极了json数据格式。
db.user.insert({name: ‘zhangsan‘, age: 21, sex: ‘male‘})
在集合中插入一条数据db.user.find()
查看集合user中的所有数据db.user.find().pretty()
以一个漂亮点的格式显示数据db.user.find({name: ‘zhangsan‘})
find的第一个参数是where选择条件,显示符合name=‘zhangsan‘的整条数据db.user.find({name: ‘zhangsan‘}, {name: 1})
find的第一个参数是指定显示内容,显示符合条件的name,1是显示,0是不显示。
使用mongoose
mongoose是一个nodejs工具库,方便使用nodejs操作mongodb
1. 首先使用mongoose连接mongodb数据库
const mongoose = require('mongoose'); // 创建一个连接,并监听各种事件,在执行connect操作时,各事件会视具体情况而触发。 mongoose.connection .on('error', function (err) { // 数据库连接失败时触发 console.log('connect error: ', err); }) .on('disconnected', function () { // 数据库断开时触发,断开重连的逻辑可以放在这里。 }) .once('open', function () { // 数据库连接成功时触发,express开启listen的逻辑可以放在这里。 }); // 启动mongod服务默认是运行在127.0.0.1上,所以下面路径是localhost // test是数据库名,如果有则连接,如果无则创建 mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });
2. Schema与Model
在mongoose中Schema、Model是非常重要的概念。Model对应mongodb中的集合 collection
,而Schema对应集合的结构,也就是结合都有哪些字段、字段的类型、是否必填、是否有缺省值等。
const UserSchema = mongoose.Schema({ name: String, age: Number, sex: Boolean }); // Schema的静态方法 UserSchema.statics.findUserByAge = function (age) { // 用then来拿到结果,如findUserByAge(21).then((res) => {})。 // 也可以在find第二个参数传回调函数 return this.find({'age': age}); } // Schema的实例方法 UserSchema.methods.findUserByName = function(name) { return this.model('User').find({ name: name }); }; // 创建一个Model,第三参数指定mongodb中collection的名字,如果不传则默认为变为复数(即Users) const User = mongoose.model('User', UserSchema, 'user'); // 创建一条数据 // 1. 直接用User创建 User.create({name: 'zhangsan', age: 27, sex: true}, function(err, info) { console.log(info); }); // 2. 新创建一个对象再添加数据到数据库 // 再次说明下现在mongoose默认是支持promise方式的,可以使用then 或 回调函数的方式 var person = new User({name: 'lisi', age: 20, sex: false}); person.save().then(res => { console.log(res); }) // 调用Schema中定义的静态方法,可以通过User直接调 User.findUserByAge(21); // 调用Schema中定义的实例方法方法,先实例化再调 const user = new User(); user.findUserByName('zhangsan'); // 删除数据,删除符合条件的一条 User.deleteOne({name: 'lisi'}).then(); // 删除符合条件的所有数据 User.deleteMany({age: 20}).then(); // 注意:remove()方法已经被弃用了!
最后附上mongoose的api文档,其他的使用方法不一一列举:
TODO
上面讲的是目前项目中已经用到的,后续可能会继续拓展的:
- docker与mongodb
- mongodb复制集之自动容灾