数据库基本概念
Node.js对数据库的相关操作
需要用mongoose第三方模块
数据库的启动和关闭
- 启动数据库:在命令行中用net start mongoDB命令启动数据库,数据库启动成功才能被连接
- 关闭数据库:net stop mongoDB
连接数据库
使用mongoose.connet()方法可以连接数据库,若要连接的数据库不存在,则会创建该数据库。该方法是一个异步函数,返回的是一个promise对象,mongoose中的大多方法都是异步函数,因此可以用then和catch接收返回内容和错误
创建集合
集合可以理解为一张数据表,包含多条数据(记录)。node.js中创建集合分两步:
- 设定集合规则,也就是确定数据表有哪些列,每一列的数据类型是什么。用mongoose.Schema(),它是一个构造函数
- 利用设定的集合规则创建集合。mongoose.model()方法创建集合,返回一个构造函数,代表这个集合
// 设定集合规则 ,实例化Schema
let courseSchema = new mongoose.Schema({
courseName: String,
author: String
});
// 创建集合
let Course = mongoose.model('Course', courseSchema); // 返回一个构造函数,代表该course集合
mongoose集合规则验证
在创建集合规则时,可以设置当前字段的验证规则,比如字符串的最短、最长长度,数字的最小最大范围等,在添加文档时必须符合验证规则,否则会报错
// 引入mongoose第三方模块 用来操作数据库
const mongoose = require('mongoose');
// 数据库连接
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true})
// 连接成功
.then(() => console.log('数据库连接成功'))
// 连接失败
.catch(err => console.log(err, '数据库连接失败'));
const postSchema = new mongoose.Schema({
title: {
type: String,
// 必选字段
required: [true, '请传入文章标题'],
// 字符串的最小长度
minlength: [2, '文章长度不能小于2'],
// 字符串的最大长度
maxlength: [5, '文章长度最大不能超过5'],
// 去除字符串两边的空格
trim: true
},
age: {
type: Number,
// 数字的最小范围
min: 18,
// 数字的最大范围
max: 100
},
publishDate: {
type: Date,
// 默认值, 没有输入时设为默认值
default: Date.now
},
category: {
type: String,
// 枚举 列举出当前字段可以拥有的值
enum: {
values: ['html', 'css', 'javascript', 'node.js'],
message: '分类名称要在一定的范围内才可以'
}
},
author: {
type: String,
// 自定义验证规则
validate: {
validator: v => {
// 返回布尔值
// true 验证成功
// false 验证失败
// v 要验证的值
return v && v.length > 4
},
// 自定义错误信息
message: '传入的值不符合验证规则'
}
}
});
const Post = mongoose.model('Post', postSchema);
Post.create({title:'aa', age: 60, category: 'java', author: 'bd'})
.then(result => console.log(result))
.catch(error => {
// 获取错误信息对象
const err = error.errors;
// 循环遍历错误信息对象
for (var attr in err) {
// 将错误信息打印到控制台中
console.log(err[attr]['message']);
}
})
MongoDB数据库导入json格式数据
可以将json格式存储的数据直接导入到MongoDB中,mongoDB中数据其实也是以json格式存储的
使用命令mongoimport -d 数据库 -c 集合 --file 到导入的文件名
例如:mongoimport -d first -c users --file D:\user.json
注意要把mongoimport.exe所在的文件路径添加到计算机Path环境中,否则命令行无法识别ongoimport命令
添加数据(创建文档)
添加数据是向数据库中的某个集合中添加,即创建文档,并添加到集合中,文档可以理解为一条记录(数据),有两种方法
- 实例化集合的构造函数 Course
// 方法1. 实例化Course 创建一个文档,记录一条数据
let courseMath = new Course({
courseName: 'Math',
author: 'teaZhang'
})
// 将数据存储到数据库中
courseMath.save();
- 用集合的构造函数的create()方法
// 方法2. 通过Course构造函数的create()方法创建文档 该方法有两种使用形式:
// 1 回调函数参数形式获取内容和错误
Course.create({
courseName: 'English',
author: 'teaWang'
}, (err, result) => {
console.log(err);
console.log(result);
});
// 2 create()返回的是一个promise对象,通过.then(),.catch()获取内容和错误
Course.create({
courseName: 'yuwen',
author: 'teaLi'
})
.then(result => console.log(result))
.catch(err => console.log(err));
查询文档
用集合的构造函数的find()方法,查询多个文档,返回的是一个数组,用findOne()方法,查询一个文档。括号中传入查询条件作为参数。
删除文档
更新文档
集合关联
ref populate
比如作者信息(作者id,名字name)这个集合author和文章集合article(文章标题title,文章作者author)进行关联,想要实现查询文章作者的信息的目的,让文章集合中的作者字段为用户信息集合中的id值。
// 作者Author集合规则
let authorSchema = new mongoose.Schema({
name: {
type: String,
required: true
}
})
let Author = mongoose.model('Author', authorSchema);
// 文章Aticles集合规则
let aticleSchema = new mongoose.Schema({
title: String,
author: { // 文章作者字段,和Author集合的作者id字段关联
type: mongoose.Schema.Types.ObjectId, // author字段的数据类型为mongodb中的id类型
ref: 'Author' // 该集合中的author字段和Author集合进行关联
}
})
let Aticles = mongoose.model('Aticles', aticleSchema);
// populate()方法可以让设置了关联集合的字段显示所关联集合的信息
Aticles.find().populate('author').then(result => console.log(result));
查询结果显示了所有的文章,文章的作者字段显示了作者的详细信息。