操作数据库的步骤
一:链接数据库
const mongoose = require("mongoose")
//通过指定的访问地址 连接mongo数据库、user是数据库名字、可随意取
//有同名的数据库就连接它,没有时就创建该名字的数据库
mongoose.connect("mongodb://127.0.0.1:27017/user",{ //基本配置
useNewUrlParser: true,
useUnifiedTopology:true
}).then(()=>{ //连接数据库操作返回的是Promise、所以可以.then操作
console.log("数据库连接成功");
}).catch(()=>{
console.log("数据库连接失败");
})
二:设置表规则
const Schema = mongoose.Schema //得到用来设置表规则的构造函数
let userSchema = new Schema({ //表字段的规则:一种普通定义,
一种规则定义
name: String, //字符可定义字符长度范围:minLength:、maxLength: 还能正则匹配 match:
sex : {
type:String,
enum:["男","女"] //sex项只能是 "男" 或者 "女"
}
tag: Array,
age: {
type: Number,
required: true,
default: '18', //也可以写Date.now储存表时的时间
min : [0,"值小于最小范围"], //值限制最小0,和错误提示
max : 100, //值限制最大100,不定义错误提示
}
},{ // Schema第二个配置参数
versionKey: false //去掉数据库中的 __v 属性
})
三:创建表,返回操作该表的对象
let userTable = mongoose.model("user", userSchema) //1表名可随便取 2表规则
表的增删改查操作
增
//userTable是创建的表对象
userTable.create({
name:"小明",
age:20,
sex:"女",
tag:["可爱","大方","美丽"]
}).then(res=>{ //返回的是Promise、所以可以.then操作
console.log("成功") //res为添加的对象,可拿到该条数据的_id
}).catch(()=>{
console.log("失败")
})
查
//3种查询方法:find({查询条件},{过滤规则},{排序及选取}) 、 findOne 、findById
//find找不到返回[]、findOne和findById查不到返回null
userTable.find({ //简单查询、第2、3个参数可省略
age:18,
name:"樱桃"
}).then(res=>{
console.log("查到的数据内容为:", res);
})
/*第一个参数:查询条件
比较查询操作符:例:age:{$ne:26} //查询age小于18的数据
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
逻辑查询操作符:例:$and:[ {age:{$ne:26}}, {sex:"女"} ] //查年龄小于26的女生
$and 逻辑与
$or 逻辑或
$nor 逻辑非
存在条件类操作符:例:tag:{ $in:["善良","女神"] } //查tag数组中存在其中字段之一的数据
$in 存在一项即可
$nin 不存在 (与上面相反)
数组相关条件的操作符:例:tag:{ $size:2 } //查tag数组长度为3的数据
$size 数组的长度
正则:例子:name:/康/ //查询name字段中包含"康"字符的数据
自定义遍历查询$where:例子
$where:function(){ //函数内this指向当前这条数据对象
return this.tag.length > 2; //返回true表示该数据符合条件,false反之
}
*/
/*第二个参数:过滤规则
对查询到的数据结果,选择性取其中的某些字段数据
例子:name:ture //返回的数据中只含有name字段 不写的默认都是false
如果第二个参数对象为空,那么就全部返回
*/
/*第三个参数:排序及选取
排序操作sort字段:
第三个参数的例子:{sort:{ age:-1 }} 将选出的数据按降序排序返回 1升序 -1降序
选取操作skip字段:一般适用于分页:
第三个参数例子:{skip:n} 选出的数据中跳过前n项 、limit:n 选出的数据中只返回前n个数据
*/
删
//删除数据比较简单
deleteOne({同查询条件})、 deleteMany 都返回Promose!!!!
例子:userTable.deleteOne({name:"丸子"}) //将name为丸子的数据删除一条
改
//改 updateOne({同查询条件},{改操作})、updateMany、findByIdAndUpDate
/*第二个参数中的属性:
$set:{name: "wzk", age: 10} //给查到的数据重新赋值, 对于引用类型是直接覆盖
$push:{tag:["帅","酷"]} //给查到的数据尾部追加,允许有重复的值
$addToSet:{tag:["开朗","阳光","阳光"]} //给查到的数据尾部追加,但是有重复的不会加
$pop:{tag: -1} //-1:从首部删除一项 1:从末尾删除一项
$pull:{$in:["幽默", "可爱"]} //删除对应的元素
*/
userTable.updateMany({ name:"小明" },$set:{name: "wzk", age: 10, sex:"男",tag:["帅帅七七"]})
表关联
//原理就是在这个表中创建一个属性,通过这个属性可以找到另一张表
//定义学生表规则
let studentSchema = new Schema({
name: String,
age: Number,
sex: String,
tag:Array,
gradeId:{ //定义一个关联属性
type:Schema.Types.ObjectId, //Schema.Types.ObjectId是mongodb特有的数据类型,用来唯一标识某条数据,创建数据自动生成该 _id属性
ref:"gradeTable" //关联到成绩表 gradeTable是成绩表对象
}
})
//定义成绩表规则
let gradeSchema = new Schema({
math: Number,
English:Number,
chinese: Number
})
//关联查询 假设两张表中都有许多数据 通过学生表查成绩表
studentTable.findOne({name:"丸子"}).populate("gradeId").then(res => console.log(res)) //res就是对应该学生的成绩数据
//比如一个表中有多个关联,populate可以多次调用一起查询
//populate第一个参数是表规则的关联字段、第二个参数是过滤(同上)