通过mongoose操作mongodb
增(创建)
mongoose的api返回基本上都是promise => async await
- 表对象.create() 进行操作之后将数据写入对应表中
- create参数单个对象添加 => 返回写入的对象结构数据(一般来说只会创建单个)
示例:let result = await db.create( {name: "路遥",age: 18,sex: true} )
- create参数多个对象添加 => 返回写入的数组结构数据
示例:let result = await db.create( {name: "路遥",age: 18,sex: true},{name: "路遥",age: 18,sex: true} )
- create参数数组内部对象添加 => 返回写入的数组结构数据
示例:let result = await db.create( [ {name: "路遥",age: 18,sex: true} ] )
删除
deleteOne(conditions) 删除符合条件的数据 => 删除单个
deleteMany(conditions) 删除所有符合条件的数据
- conditions
- 删除条件参数与find的查询条件的参数使用方法一致
改
update(不支持使用)
updateOne 修改单个符合查询条件的数据
updateMany 修改所有符合查询条件的数据
findByIdAndUpdate
Model.update(conditions,doc,[options],[callback])
condition 查询条件(和find一样)
doc 要修改的内容
options 选项
callback 回调 参数err,info(更新成功的信息) , 可以用Promise代替
doc 表规则中属性名的属性值都可以进行修改
{password:"456"} 修改 password 为"456"
示例:
let result = await db.updateOne({name:"路遥"},{age:666})
let result = await db.updateMany({name:{$regex:"路遥"}},{age:666})
{$set:{"userInfo.test":"123"}} 修改 userInfo.test 为"123"
示例:
let result = await db.updateOne({name:"路遥"},{$set{"qqq.qwe":"xiugai"}})
let result = await db.updateOne({name:"路遥"},{"qqq.qwe":"xiugai"}) $set可以不用写
{$inc:{age:n}} 修改 age 正数自增n 负数自减n
示例:
let result = await db.updateOne({name:"路遥"},{$inc:{age:-10}})
{$unset:{age:0}} 移除 age 属性(值随便写啥都是移除)
{$push:{arr:999}} 为 arr数组 添加一条 999 值
{$push:{arr: {$each:[1,4,5,9],$slice:-5}}} 为 arr数组 添加 1 4 5 9 值,并截取倒数5个
{$addToSet:{arr:20}} 为 arr数组 添加一条 20 值,如果20存在,则不添加
{$pop:{arr:1}} 删除 arr数组 的最后一项,arr值为-1则删除第一项
{$pull:{arr:123}} 删除 arr数组 所有123值
查(查找数据)
- 表对象.find( conditions, [projection],[option] );
- 表对象.findOne( conditions, [projection], [option] ); 查询符合条件第一个数据
与find使用方法一样,不同点在于 findOne返回的是一个 对象结构,而find返回的是一个 数组结构
- 表对象.findById( id, [projection], [option] ); 查询符合条件数据, 返回 对象结构
- conditions 常见查询条件
- 通过表属性名与属性值进行查找 => 属性名与属性值设置可多个(精确查找)
示例: let result2 = await db.find( {name: "路遥",age: 17} )
- 返回所有符合条件的数据 => 数据是一个数组结构
- 未查找到数据 => 返回一个空数组
- 辅助查询
1. $or $nor 或者 取反
示例:
let result = await db.find( {$or:[{name: "路遥"},{age: 17}]} )
=> 获取所有符合其中一项的数据
let result = await db.find( {$nor:[{name: "路遥"},{age: 17}]} )
=> 获取所有不符合其中项的数据
2. $gt $gte $lt $lte $ne 大于 大于等于 小于 小于等于 不等于
示例:
let result = await db.find({ name: "路遥",age: {$gt:17} })
=> 获取大于17的所有数据
3. $in $nin 属性名的对应值是否存在 存在/不存在 (指定的多个字段之类)
示例:
let result = await db.find({name:{$in:"路遥"} }) => 数据存在对应属性值的数据将会被获取
let result = await db.find({name:{$nin:"路遥"} }) => 数据存在对应属性值的数据将不会被获取,将会获取其他不存在该属性值的数据
4. $exists 存在某属性
示例:
let result = await db.find({ qqq:{$exists:true} })
5. $size 数组长度匹配 {arr:{$size:2}}
6. $all 数组中是否存在指定的所有项, {arr:{all:[123,456]}}
7. $where 可以使用JavaScript代码或函数,{$where:"this.age===18"}
示例:
let result = await db.find({$where:'this.age > 20'},{},{})
*8. 正则 使用正则匹配 模糊查询(只要name属性中包含九,就能查询到)
示例:
let result = await db.find({name:{ $regex:"久" }})
- projection 设置返回内容
属性名:1 || 0 => 1表示显示对应属性 0表示隐藏对应属性 (默认为1)
- options 查询条件配置
skip:Number 略过number项数据
limit:Number 最多返回number项数据
sort:{age:1} 正数从小到大 负数从大到小
练习
const mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1:27017/crud")
.then(() => {
console.log("连接成功");
})
.catch(() => {
console.log("连接失败");
})
let sch = new mongoose.Schema({
name: {
type: String,
required: true,
unique: true,
trim: true,
},
sex: {
type: String,
enum: ["男", "女", "未知"]
},
age: {
type: String,
required: true,
}
}, {
versionKey: false
})
let mongo = mongoose.model("l", sch)
// mongoose的api返回基本上都是promise => async await
async function add() {
// 增
// let result = await mongo.create({
// name:"路遥",
// age: 18,
// sex: "男"
// })
// 查
// let result = await mongo.find({$or:[{name:"路遥"},{age: 17}]})
// 改
// let result = await mongo.updateOne({ name: "路遥" }, { age: 666 })
// 删
// let result = await mongo.deleteMany({name:"路遥"})
console.log(result)
}
add()
表关联
怎么同时运行app.js和mongodb文件?
require(“模块”) 对应模块会自定义执行一次
表关联
ObjectId 类型 => 表关联(两个不相关的表,进行数据交流)
mongoose.Schema.Types.ObjectId,
ref: “需要设置表关联的名称”
设置时 将对应的表中数据 objectId 进行赋值给表关联类型即可
获取 find查询api.populate("表关联属性名")
mongoose.js
//引入mongodb.js文件 -> 启动数据库
require("./mongodb/mongodb.js")
require("./mongodb/mongoUser.js")
require("./mongodb/mongoShop")
mongodb.js
const mongoose = require("mongoose")
mongoose.connect("mongodb://127.0.0.1:27017/luyao")
.then(()=>{
console.log("数据库连接成功")
})
.catch(()=>{
console.log("数据库连接失败")
})
mongoUser.js
const mongoose = require("mongoose")
//创建用户信息表
let userSchema = mongoose.model(
"userInfo",
new mongoose.Schema(
{
name: String,
age: Number,
sex: Boolean
},
{
versionKey: false
}
)
)
userSchema.create({
name: "徐星"
age: 24,
sex: true
})
mongoShop.js
const mongoose = require("mongoose")
let shopSchema = mongoose.model(
"shop",
new mongoose.Schema(
{
shopName: String,
shopPra: Number,
shopAbout:{
type: mongoose.Schema.Types.ObjectId,
//ref 设置关联的表名
ref: "userInfo"
}
},
{
versionKey: false
}
)
)
shopSchema.create({
shopName: "衣服",
shopPra: 999,
shopAbout: "642830765dae0053e2ec531e"
})
shopSchema.find().populate("shopAbout").then((data)=>{
console.log(data)
})