mongoose安装和连接数据库
npm i mongoose
导入mongoose
const mongoose = require('mongoose')
mongoose.set("strictQuery",true)
连接数据库
mongoose.connect('mongodb:127.0.0.1:27017/test')
设置回调
mongoose.connection.on('open',()=>{
console.log("连接成功")
})
mongoose.connection.on('error',()=>{
console.log("连接失败")
})
mongoose.connection.on('close',()=>{
console.log("连接关闭")
})
setTimeout(()=>{
mongoose.disconnect();
},2000)
mongoose.connection.on与mongoose.connection.once
的区别在于当数据库断开时,once,回调函数不会执行,而on可以
插入文档
mongoose.connection.on('open',()=>{
//5.创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema =new mongoose.Schema({
name:String,
author:String,
price:Number
})
//6.创建模型对象。对文档操作的封装对象
let BookModel = mongoose.model('book',BookSchema) //数据库名(集合),数据库表名(结构对象)
BookModel.create({
name:"西游记",
author:"吴承恩",
price:20
},(err,data)=>{
if(err){
console.log(err)
return
}
console.log(data)
})
//项目运行过程中,不会添加该代码
mongoose.disconnect();
})
字段类型
类型 | 描述 |
---|---|
String | 字符串 |
Number | 数字 |
Boolean | 布尔值 |
Array | 数组,也可以用[] |
Date | 日期 |
Buffer | buffer对象 |
Mixed | 任意类型,需要使用mongoose.Schema.Types.Mixed 指定 |
ObjectId | 任意类型,需要使用mongoose.Schema.Types.ObjectId 指定 |
Decimal128 | 任意类型,需要使用mongoose.Schema.Types.Decimal128 指定 |
字段值验证
Mongoose有一些内建验证器,可以对字段值进行验证
必填项
title:{type:String,required:true}
默认项
title:{type:String,default:"匿名"}
枚举值
title:{type:String,enum:[1,2]}
唯一值
title:{type:String,unique:true}
删除文档
mongoose.connection.on('open',()=>{
//5.创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema =new mongoose.Schema({
name:String,
author:String,
price:Number
})
//6.创建模型对象。对文档操作的封装对象
let BookModel = mongoose.model('book',BookSchema) //数据库名(集合),数据库表名(结构对象)
// 删除一个
BookModel.deleteOne({author:'曹雪芹'},(err,data)=>{
if(err){
console.log("删除失败")
return
}
console.log(data)
}
// 批量删除
BookModel.deleteMany({is_hot:false},(err,data)=>{
if(err){
console.log("删除失败")
return
}
console.log(data)
}
//项目运行过程中,不会添加该代码
mongoose.disconnect();
})
更新文档
mongoose.connection.on('open',()=>{
//5.创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema =new mongoose.Schema({
name:String,
author:String,
price:Number
})
//6.创建模型对象。对文档操作的封装对象
let BookModel = mongoose.model('book',BookSchema) //数据库名(集合),数据库表名(结构对象)
// 更新
BookModel.updateOne({name:"红楼梦"},{price:9.9},(err,data)=>{
if(err){
console.log("更新失败")
return
}
console.log(data)
}
// 批量更新
BookModel.updateMany({author:"余华"},{is_hot:true},(err,data)=>{
if(err){
console.log("更新失败")
return
}
console.log(data)
}
//项目运行过程中,不会添加该代码
mongoose.disconnect();
})
读取文档
mongoose.connection.on('open',()=>{
//5.创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema =new mongoose.Schema({
name:String,
author:String,
price:Number
})
//6.创建模型对象。对文档操作的封装对象
let BookModel = mongoose.model('book',BookSchema) //数据库名(集合),数据库表名(结构对象)
// 读取
BookModel.findOne({name:"红楼梦"},(err,data)=>{
if(err){
console.log("读取失败")
return
}
console.log(data)
}
// 根据id获取
BookModel.findById("a124s",(err,data)=>{
if(err){
console.log("读取失败")
return
}
console.log(data)
}
// 批量读取
BookModel.find({author:"余华"},(err,data)=>{
if(err){
console.log("读取失败")
return
}
console.log(data)
}
// 读取all
BookModel.find((err,data)=>{
if(err){
console.log("读取失败")
return
}
console.log(data)
}
//项目运行过程中,不会添加该代码
mongoose.disconnect();
})
条件控制
运算符
在mongodb不能> < >= <= !==等运算符,需要使用替代符号
>
使用$gt
<
使用$lt
>=
使用$gte
<=
使用$lte
!==
使用$ne
BookeModel.find({price:{$lt:20}},(err,data)=>{
if(err){
console.log("读取失败")
return
}
console.log(data)
})
逻辑运算
$or
逻辑或的情况
BookeModel.find({$or:[{author:"曹雪芹"},{author:"余华"}]},(err,data)=>{
if(err){
console.log("读取失败")
return
}
console.log(data)
})
$and
逻辑与的情况
BookeModel.find({$and:[{price:{$gt:30}},{price:{$lt:70}}]},(err,data)=>{
if(err){
console.log("读取失败")
return
}
console.log(data)
})
正则匹配
BookeModel.find({name:/三/},(err,data)=>{
if(err){
console.log("读取失败")
return
}
console.log(data)
})
BookeModel.find({name:new RegExp('三')},(err,data)=>{
if(err){
console.log("读取失败")
return
}
console.log(data)
})
个性化读取
字段筛选
//0:不要的字段
//1:要的字段
SongModel.find().select({_id:0,title:1}).exec(function(err,data)
if(err) throw err;
console.log(data);
mongoose.connection.close(); //mongoose.disconnect();
});
数据排序
//sort排序
//1:升序
//-1:倒序
SongModel.find().sort({hot:1}).exec(function(err,data)
if(err) throw err;
console.log(data);
mongoose.connection.close() //mongoose.disconnect();
});
数据截取
//skip跳过limit限定
SongModel.find().skip(10).limit(10).exec(function(err,data)
if(err) throw err;
console.log(data);
mongoose.connection.close(); //mongoose.disconnect();
});
代码模块化
#TODO