重学Node.js 第3篇mongodb以及mongoose的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重学Node.js 第3篇mongodb以及mongoose的使用相关的知识,希望对你有一定的参考价值。

mongodb以及mongoose的使用

课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html
项目github地址:https://github.com/hellozhangran/happy-egg-server

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文档,其他的使用方法不一一列举:

http://www.mongoosejs.net/docs/api.html

TODO

上面讲的是目前项目中已经用到的,后续可能会继续拓展的:

  • docker与mongodb
  • mongodb复制集之自动容灾

以上是关于重学Node.js 第3篇mongodb以及mongoose的使用的主要内容,如果未能解决你的问题,请参考以下文章

重学Node.js 第1&2篇本地搭建Node环境并起RESTful Api服务

Get全栈技能点 Vue2.0/Node.js/MongoDB 打造商城

Vue2.0+Node.js+MongoDB 全栈打造商城系统

node.js操作数据库之MongoDB+mongoose篇

Vue2.0+Node.js+MongoDB全栈打造商城系统

Mongodb 以及 node.js中使用mongoose操作数据库