1.数据库相关概念
在一个数据库软件中可以包括多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据)。
术语 | 解释说明 |
---|---|
database | 数据库,MongoDB数据库软件中可以建立多个数据库 |
collection(表) | 集合,一组数据的集合,可以理解为javaScript中的数组 |
document(数据) | 文档,一条具体的数据,可以理解为javaScript中的对象 |
field | 字段,文档中的属性名称,可以理解为JavaScript中的对象属性 |
2.Mongoose点三方包
- 使用Node.js操作MongoDB数据库需要依赖Node.js第三方包mongoose
- 使用npm install mongoose命令下载
3.启动MongoDB(必须管理员权限下运行)
在命令行中关闭MongoDB:net stop mongodb
在命令行中启动MongoDB:net start mongodb
4.连接数据库
mongoose.connect('mongodb://localhost/playground',{useNewUrlParser:true})
.then(()=>console.log('数据库连接成功'))
.catch(err=>console.log('数据库连接失败',err));
5.创建数据库
在MongoDB中不需要显示创建数据库,如果正在使用的数据库不存在,MongoDB会自动创建。
6.创建集合
创建集合分为两步,一是对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。
//设定集合规则
const courseSchema=new mongoose.Schema({
name:String,
author:String,
isPublished:Boolean
});
//创建集合并应用规则
const Course=mongoose.model("Course",courseSchema);//Courses
7.1创建文档方法一
创建文档实际上就是向集合中插入数据
- 创建集合实例
- 调用实例对象下的save方法将数据保存到数据库中。
//创建集合实例
const Course=new Course({
name:'Node.js course',
author:'学生',
tags:['node','backend'],
isPublished:true
});
//将数据保存到数据库中
Course.save();
7.2创建集合文档方法二
Course.create({
name:'javascript基础',
author:'学生',
isPublish:true
},(err,doc)=>{
//错误对象
console.log(err);
//当前插入的文档
console.log(doc);
})
Course.create({name:'javascript基础',author:'',isPublish:true})
.then(doc=>{console.log(doc)})
.catch(err=>{console.log(err)})
8.mongoDB数据库导入数据
导入数据前首先找到mongodb数据库的安装目录,将安装目录下的bin目录放置在环境变量中。
mongoimport -d数据库名称 -c 集合名称 --file要导入的数据文件
mongoimport -d playground -c users --file ./user.json
9查询文档
//根据条件查找文档(条件为空则查找所有文档)
Course.find().then(result=>console.log(result))
//返回文档集合
[{
_id:sdfsdfsdfsdfds,
name:'node.js',
author:'学生'
},{
_id:sdfdsfgghhdfgd,
name:'javascript',
author:'乔晓琪'
}]
通过ID进行查询
Course.find({_id:'sdffffsdfsdfsdf'}).then(result=>console.log(result))
findOne方法返回一条文档默认返回当前集合中的第一条文档
User.findOne({name:'javascript'}).then(result=>console.log(result))
//匹配大于$gt 小于$lt
User.find({age:{$gt:20,$lt:50}}).then(result=>console.log(result))
//匹配包含
User.find({hobbies:{$in:['敲代码']}}).then(result=>console.log(result))
//选择要查询的字段
User.find().select('name email').then(result=>console.log(result))
//将数据按年龄进行升序排列
User.find().sort('age').then(result=>console.log(result))
//将数据按年龄进行降序排列
User.find().sort('-age').then(result=>console.log(result))
//skip跳过多少条数据 limit限制查询数量
User.find().skip(2).limit(2).then(result=>console.log(result))
10.删除文档
//删除单个
//查找到一条文档并且删除
//返回删除的文档
//如果查询条件匹配了多个文档那么将会删除第一个匹配的文档
Course.findOneAndDelete({_id:'sdfdsfdsfdsgg'}).then(result=>console.log(result))
//删除多个
User.deleteMany({}).then(result=>console.log(result))
11.更新文档
//更新单个
User.updateOne({查询条件},{要修改的值}).then(result=>console.log(result))
//例子
User.updateOne({name:'李四'},{name:'张三'}).then(result=>console.log(result))
//更新多个
User.updateMany({查询条件},{要更改的值}).then(result=>console.log(result))
//例子
User.updateMany({},{age:56}).then(result=>console.log(result))
12.mongoose验证
在创建集合规则时,可以设置当前字段的验证规则。验证失败则输入插入失败
- required:true|false必传字段
- minlength:number最小长度(只针对字符串类型)
- maxlength:number最大长度(只针对字符串类型)
- min:number(只针对数值类型)
- max:number(只针对数值类型)
- trim:true|false去除两边的空格
- default(默认值):Date.now(当前时间)
- enum(枚举类型):[‘java’,‘html’,‘css’] (表示要传入的值必须是java、html、css)
- validate:自定义验证器
//例子
const postSchema=new mongoose.Schema({
title:{
type:String,
//required:true,
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:'html',author:'db'})
.then(result=>console.log(result))
.catch(error=>{
//获取错误信息对象
const err=error.errors;
//循坏错误信息对象
for(var attr in err){
//将错误信息打印到控制台中
console.log(err[attr]['message']);
}
})
13.集合关联(表关联)
通常不同集合的数据之间是有关联的,例如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的,要查询文章的所有信息包括发表用户,就需要用到集合关联(也就是多表关联)。
//用户集合
const User=mongoose.model('User',new mongoose.Schema({
name:{
type:String
}
}));
//文章集合
const Post = mongoose.model('Post',new mongoose.Schema({
title:{
type:String
},
//使用ID将文章集合和作者集合进行关联
author:{
type:mongoose.Schema.Types.ObjectId,
ref:'USER'
}
}));
//联合查询
Post.find()
.populate('author')
.then((err,result)=>console.log(result));