Node 操作 MongoDB 数据库
MongoDB 相关概念
术语 | 解释说明 |
---|---|
database | 数据库: |
collection | 集合:一组数据的集合(理解为一张表) |
document | 文档:一条具体的数据(理解为一行) |
field | 字段:文档中的属性名 |
Node 操作 MongoDB 的第三方包 - mongoose
- 使用 mongoose 操作 MongoDB 数据库
- 安装:
npm install mongoose
启动和停止数据库
- 启动:在命令行输入
net start mongodb
- 停止:在命令行输入
net stop mongodb
MongoDB 导入数据
使用 mongoimport 导入数据,使用之前要确保 mongoimport.exe 所在的路径添加到环境变量
mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件
连接数据库
在 mongodb 不需要显式的创建数据库,但数据库不存在,mongodb 会自动创建
const mongoose = require('mongoose');
// 连接数据库
// 在mongodb不需要显式的创建数据库,但数据库不存在,mongodb会自动创建
mongoose.connect('mongodb://localhost/playground', {
useUnifiedTopology: true,
useNewUrlParser: true
}).then(() => console.log('数据库连接成功'))
.catch((err) => console.log(err, '数据库连接错误'))
创建集合以及文档
要想创建集合需要先创建集合规则,然后使用集合规则来创建集合
// 创建集合以及文档
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('连接数据库成功');
}).catch((err) => {
console.log(err, '连接数据库错误');
})
// 创建集合规则
const courseSchema = new mongoose.Schema({
name: String,
author: String,
isPublished: Boolean
})
// 使用规则创建集合
// 1. 集合名称
// 2. 集合规则
// 返回一个构造函数, 这个构造函数就代表这个集合
const Course = mongoose.model('Course', courseSchema);
// 创建文档
// 创建一个集合构造函数的实列,
const course = new Course({
name: 'node.js基础',
author: '黑马',
isPublished: true
})
// 调用实列对象的sava方法保存
course.save();
向集合中插入文档的另外一种方式
可以使用集合对象的 create 方法来插入文档
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('连接数据库成功');
}).catch((err) => {
console.log(err, '连接数据库错误');
})
// 创建集合规格
const courseSchema = new mongoose.Schema({
name: String,
author: String,
isPublished: Boolean
})
const Course = mongoose.model('Course', courseSchema);
Course.create({
name: 'Java',
}).then(result => console.log(result))
.catch(err => console.log(err))
查询文档
const mongoose = require('mongoose');
// 连接数据库
mongoose.connect('mongodb://localhost/playground', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('导入数据成功');
}).catch(err => {
console.log(err, '数据库导入失败');
})
// 创建集合规则
const userSchema = new mongoose.Schema({
name: String,
age: Number,
email: String,
password: String,
hobbies: [String]
})
// 使用集合规则创建集合
const User = mongoose.model('User', userSchema);
// 查询用户集合中的所有文档
User.find().then(result => console.log(result));
// 通过 _id 字段查询
User.find({
_id: '5c09f267aeb04b22f8460968'
}).then(result => console.log(result))
// findOne 方法返回一条文档,默认返回当前集合第一条文档
User.findOne({
age: 10
}).then(result => console.log(result))
// 查找 age大于 20 小于 40的所有文档
User.find({
age: {
$gt: 20,
$lt: 40
}
}).then(result => console.log(result))
// 查找 hobbies 中包含 '足球' 文档
User.find({hobbies:{$in:['足球']}}).then(result=>console.log(result))
// 选择要查询的字段, 如果不想查询某个字段可以在字段的前面加上 -
User.find().select('name email -_id').then(result => console.log(result))
// 根据 age 字段进行升序排列
User.find().sort('age').then(result => console.log(result))
// 根据 age 字段进行降序排列
User.find().sort('-age').then(result => console.log(result))
// skip() 跳过多少条数据
// limit() 限制查询数量
User.find().skip(2).limit(3).then(result => console.log(result))
删除文档
// 导入 mongoose 模块
const mongoose = require('mongoose');
// 连接数据库
mongoose.connect('mongodb://localhost/playground', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('连接数据库成功');
}).catch(err => {
console.log(err, '数据库导入失败');
})
// 创建集合规则
const userSchema = new mongoose.Schema({
name: String,
age: Number,
email: String,
password: String,
hobbies: [String]
})
// 使用集合规则创建集合
const User = mongoose.model('User', userSchema);
// 删除单个
User.findOneAndDelete({
name: '张三'
}).then(result => console.log(result))
// 删除多个文档, 如果没有查询条件,就会删除全部
User.deleteMany({}).then(result=>console.log(result))
更新文档
const mongoose = require('mongoose');
// 连接数据库
mongoose.connect('mongodb://localhost/playground', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('连接数据库成功');
}).catch(err => {
console.log(err, '数据库导入失败');
})
// 创建集合规则
const userSchema = new mongoose.Schema({
name: String,
age: Number,
email: String,
password: String,
hobbies: [String]
})
// 使用集合规则创建集合
const User = mongoose.model('User', userSchema);
// 更新集合中的单个文档 updateOne({查询条件}, {要求修改的值})
User.updateOne({name:'张三'}, {name:'张三updata'}).then(result=>console.log(result))
// 更新集合中的多个文档
User.updateMany({}, {
age: 56
}).then(result => console.log(result))
mongoose 验证
/**
* required: true 必传字段
* minlength 最小长度
* maxlength 最大长度
* trim 去除首尾空格
* min 数字的最小范围
* max 数字的最大范围
* default 默认值
* enum 枚举,列出当前字段可以拥有的值
*/
const mongoose = require('mongoose');
// 连接数据库
mongoose.connect('mongodb://localhost/playground', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('连接数据库成功');
}).catch(err => {
console.log(err, '数据库导入失败');
})
const postSchema = new mongoose.Schema({
title: {
type: String,
// 属性值传入一个列表, 列表的第二项为错误提示
required: [true, '请传入文章标题'],
minlength: 2,
maxlength: 6,
trim: true,
},
age: {
type: Number,
min: 18,
max: 100,
},
publishDate: {
type: Date,
default: Date.now,
},
category: {
type: String,
// enum 类型的设置方法
enum: {
values : ['html', 'css', 'js'],
message : '分类名称要在范围内'
}
},
author: {
type: String,
// 自定义验证器
validate: {
validator: (v) => {
// 返回布尔值, 成功返回 true, 否则返回 false
return v.trim.lenght > 4
},
// 自定义错误信息
message: "不符合"
}
}
})
const Post = mongoose.model('Post', postSchema)
Post.create({
title: ' 111 ',
age: 60,
category: 'java',
author: ' 123 '
}).then(result => console.log(result))
.catch(error => {
// 获取错误信息对象
let errList = error.errors;
// 循环错误信息对象
for (let attr in errList) {
// 将错误信息打印到控制台中
console.log(errList[attr]['message']);
}
})
集合关联
const mongoose = require('mongoose');
// 连接数据库
mongoose.connect('mongodb://localhost/playground', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log('连接数据库成功');
}).catch(err => {
console.log(err, '数据库导入失败');
})
// 用户集合规则
const userSchema = new mongoose.Schema({
name: {
type: String,
required: true
}
});
// 文章集合规则
const postSchema = new mongoose.Schema({
title: {
type: String
},
author: {
// 文章集合和用户集合关联 type:mongoose.Schema.Types.ObjectId, ref:'User'
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
})
// 创建用户集合
const User = mongoose.model('User', userSchema);
// 创建文章集合
const Post = mongoose.model('Post', postSchema);
// 创建用户
// User.create({
// name: 'xiaowen1'
// }).then(result => console.log(result))
// 创建文章
// Post.create({
// title : 'post1',
// author:'5db4054eefe45d807c8b435e'
// }).then(result=>console.log(result))
// 关联查询 => populate
Post.find().populate('author').then(result => console.log(result))