数据库的增删改查都是对表进行
目录
改(update,updateOne,updateMany,findByIdAndUpdate)
doc 的 $push $each $slice $pop $pull $addToSet
删(deleteOne findByIdAndDelete deleteMany)
简单创建一个数据库添加数据(创建和连接数据库==>表规则==>加数据)
//创建链接数据库
const mongoose = require('mongoose')
mongoose.connect('mongodb://127.0.0.1:27017/demo', {
useNewUrlParser: true, // 防止莫名警告信息的 两条配置
useUnifiedTopology: true
})
.then(() => {
console.log('数据库连接成功');
})
.catch(() => {
console.log('数据库连接失败');
})
//表规则
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const userSchema = new Schema({
user: {
type: String,
required: true,
},
status: [String],
age: Number,
}, {
versionKey: false
})
//生成表
const userDB = mongoose.model('users', userSchema)
//导出表
module.exports = userDB
//引入表 加数据
const userDB = require('./models')
// userDB.create({
// user: '张三',
// age: '12'
// },
// {
// user: '李四',
// age: "12"
// },
// {
// user: 'hahah'
// }
// )
// userDB.create([
// {
// user: '路遥',
// status: ['帅气', '磁性', '长发飘飘'],
// age: 40
// },
// {
// user: '许鑫',
// status: ['搞笑', '帅气', '有钱'],
// age: 58
// },
// {
// user: '丸子',
// status: ['漂亮', '腿长', '有钱'],
// age: 18
// },
// {
// user: '鲁班',
// status: ['磁性', '油腻', '爱吃猪脚'],
// age: 30
// },
// {
// user: 'cherry',
// status: ['漂亮', '气场', '有钱'],
// age: 30
// },
// ])
查询 (find findOne fineById)
userDB.find(conditions, [projection], [options], [cb])
// conditions: 查询条件
// projection: 返回内容选项 对查找到的数据筛选那些属性展示(除了不显示_id尽量全1或0)
// option: 查询配置选项 数据在进行完上两个条件操作后对数据前几条展示 以及按照什么排序进行操作
// cb 回调 err data 可用promise替代
find查询 (多个)
find()返回的是一个数组,数组里面装着对象。
{user:'张三'} 在数据库中user中查询有没有张三的
//用async await 或.then操作拿结果
let result = userDB.find({ user: '张三' }).then((data) => {
console.log(data);
})
[
{
_id: new ObjectId("63708581f9e02a851fd72cc7"),
user: '张三',
status: [],
age: 12
}
]
let { username, password } = req.body
//这种写法{username}是{username:username}简写 表示在数据库username中是否有username的
//用于项目不确定值时候
let result = await userDB.find({ username })
当通过find查询不到数据时候 他会显示[](空数组)
//王五不在我们数据库中
let result = userDB.find({ user: '王五' }).then((data) => {
console.log(data);
})
findOne查询 (查找一个)
let result = userDB.findOne({ user: '张三' }).then((data) => {
console.log(data);
})
{
_id: new ObjectId("63708581f9e02a851fd72cc7"),
user: '张三',
status: [],
age: 12
}
当通过findone查询不到数据时候 他会显示null
//王五不存在我们的数据库中
let result = userDB.findOne({ user: '王五' }).then((data) => {
console.log(data);//null
})
find与findone的区别
返回值不同
findOne()返回的是一个对象 当找不到时返回null
find()返回的是一个数组,数组里面装着对象。找不到时返回【】
返回所有符合条件的的对象不同
1、find()会返回所有符合条件的对象
2、findOne()会返回符合条件的第一个对象
当我们数据库中通过find查询查询到多个时 他会把所有查询到的结果返回
let result = userDB.find({ user: '张三' }).then((data) => {
console.log(data);
})
[
{
_id: new ObjectId("63708581f9e02a851fd72cc7"),
user: '张三',
status: [],
age: 12
},
{
_id: new ObjectId("6370900fd35dab9e2c50f11a"),
user: '张三',
status: [],
age: 19
}
]
findone查询只会返回查询到的第一个满足条件的结果
let result = userDB.findOne({ user: '张三' }).then((data) => {
console.log(data);
})
{
_id: new ObjectId("63708581f9e02a851fd72cc7"),
user: '张三',
status: [],
age: 12
}
fineById(通过id查找)
id就是存入mongodb中的id 只能通过_id进行查找
conditions
{}是基础的条件块 {user:'张三'}查询user是张三的数据 那么当条件复杂时应该怎样书写呢
// $and 要满足所有的条件 { $and: [{ age: 30 }, { user: 'cherry' }] } 查询age是30并且user是cherry的数据 userDB.find({ $and: [{ age: 30 }, { user: 'cherry' }] })
// $or 或者 { $or: [{ age: 30 }, { age: 58 }] } age为30或者58的数据都返回
// $nor 都不 $nor: [{ age: 30 }, { age: 58 }] } age为30或者58的数据 都不要 其他的都返回
// $lt 小于 $lte 小于等于 $gt 大于 $gte 大于等于 $ne 不等于 { age: { $gte: 40 } } age大于等于40的数据
// $in 在 $nin 不在(不取数组内数组项的数据) { user: { $in: ['cherry', '丸子'] } } 找满足数组内数组项的 数据 与第一个&and区分这是对user进行 &and不可以对同一个进行多个限制
// userDB.create({
// user: '朱雀',
// status: ['漂亮', '气场', '有钱'],
// })
// $exists { age: { $exists: false } 找没有age属性的 数据 如果为 true 那就是找有age属性的数据
// $size { status: { $size: 2 } } 找status 数组长度为2的数据
// $all 数组中是否存在指定的所有项 { status: { $all: ['帅气', '磁性'] } 找 status数组中 数组项 既有 '帅气',又有'磁性' 的数据
// $where 可以使用 js代码或函数 { $where: "this.age === 58" } this指向每一条数据 选取 age为58的数据
// 也可以正则匹配
// {user:正则}
projection 返回内容选项
// projection 返回内容选项 可以选择查询到的对象最终返回一些什么属性
// { status: 0, age: 0 }这两个不要给零
userDB.find({ age: 40 }, { status: 0, age: 0 })
.then((data) => {
console.log(data);
})
.catch((err) => {
console.log(err);
})
结果==> { _id: new ObjectId("62863c7a647a390e0605969e"), user: '路遥' }
// { age: 1 }// 只显示 age属性 和 _id 属性
// { age: 1, _id: 0 } // 只显示 age属性 只有这种情况去除_id才可以有0 也有1
// 要么全写 1 要么就全写 0 projection 中
userDB.find({ age: 40 }, { age: 0, status: 0 }) // 只显示 age属性 和 _id 属性
.then(data => {
console.log(data);
})
.catch(err => {
console.log(err);
})
option: 查询配置选项
// option: 查询配置选项
// { skip: 2 } 跳过找到的前两条数据 保留后面其他的数据
// { limit: 2 } 保留前两条数据
// { sort: { age: 1 } } 数据项 按照age属性 1 升序 -1 降序
// userDB.find({ age: { $lt: 40 } }, { user: 1, age: 1 }, { sort: { age: -1 } })
// .then(data => {
// console.log(data);
// })
// .catch(err => {
// console.log(err);
// })
第一个结果没有任何排序操作的时候的结果
第二个结果是按照age进行升序排列
按照age进行降序排列
实际操作
async function fn() {
const result = await userDB.findOne({ age: { $lt: 40 } })
console.log(result);
const result1 = await userDB.findById({ _id: result._id }, { age: 1 })
// const result1 = await userDB.findById(result._id) // 或者直接传_id值
console.log(result1);
}
fn()
改(update,updateOne,updateMany,findByIdAndUpdate)
- update (修改多条) updateOne(修改匹配到的第一条数据) updateMany(修改多条) findByIdAndUpdate(只能通过_id去匹配 修改匹配到的一条数据)
- update<==>updateMany 他们两个对查询到的数据可以全部更改 功能是相同的
- userDB.update(conditions, doc, options, cb)
- doc 要修改的内容
- 更改后的数据只能在数据库中进行刷新观看无法通过userDB.update({},{}).then((date)=>{console.log(date)})中的date来获取
update
//查找到路遥数据将路遥数据中的age改为12
userDB.update({user:'路遥'},{age:12})
updateOne
//将查找到的年龄是18的数据年龄修改为23 但只修改找到的第一个
userDB.updateOne({age:18},{age:23})
doc复杂操作
当我们doc要做一些复杂的修改不想前面的两个例子这么简单我们应该怎么做呢
对数据库中的数组(status)进行修改
//对status进行全面覆盖来修改数组值
userDB.updateOne({age:18},{status:['美丽','大方','温柔']})
上面的操作是对数组全部替换 我们想只对数组中某个元素进行操作因该怎么办呢 我只想修改age是18岁 status中数组的第一个将漂亮变成美丽
修改数组中的值
//找到status中第一个变成美丽
userDB.update({age:18}, { 'status.0': '美丽' })
修改对象内的值
假设有个article属性 {title,content}
//查找age是18数据 讲数据中的article属性中的title改为新标题
userDB.update({age:18}, { 'article.title': '新标题' })
给数组添加值
//找到age是十八的数据在status下表3加入可爱值
userDB.update({age:18},{'status.3':'可爱'})
给对象添加属性 $set
还是假设有个article属性 {title,content} 建库的时候没有建
不使用$set也可以就像上面给数组添加值也能加入这个author属性
//找到年龄是18的数据 article是我们假设数据中有的属性 我们想要在article对象中加一个属性author且内容是zhang
user.update({age:18},{ $set: { 'article.author': 'zhang' } })
给对象移除属性 $unset
//找到age是18数据删除数据中的status status后面是什么无所谓因为$unset就是删除的意思
userDB.update({age:18},{ $unset:{status:0}})
年龄操作 $inc
//找到age是18数据在age上让年龄加1
userDB.update({age:18},{$inc:{age:1}})
//{ $inc: { age: 1 } ==>age+1 { $inc: { age: -2 } ==>age-2 年龄减2 完全由后面的值决定增减
doc 的 $push $each $slice $pop $pull $addToSet
//我们可以通过{'status.3':"风流倜傥"}来向数组添加数据 但是当我们不知道这个数组多长时用push
userDB.update({user:'丸子'} ,{ $push: { status: '最穷的' } }) 往数组最后添加提条数组项
//$each遍历数组 可以将数据一条一条添加到status中不用写三条语句
// 把数组中的每一项 都添加到status数组的末尾
userDB.update({user:'丸子'},{ $push: { status: { $each: ['最惨的', '最扯的', '最123的'] } } })
// $slice 截取目标数据的前200条数据 (可以用于 限制数组的长度)
//保留status中前200个后面的截取掉
{ $push: { status: { $each: ['最惨的', '最扯的', '最123的'], $slice: 200 } } }
{ $pop: { status: 1 } }) //删除status数组的最后一项 -1 删除status数组的第一项
// $pull 删除指定项
{ $pull: { status: '最惨的' } } //删除值为 '最惨的'的数组项
//$addToSet为数组添加一条数据 如果存这条数据 就不添加
$addToSet { $addToSet: { status: '最惨的' } }
userDB.updateMany({ user: '朱雀' },{ $addToSet: { status: '最惨的' } })
.then(res => {
console.log(res);
})
.catch(err => {
console.log(err);
})
pop 哪里只能写1或者-1写别的会报错
删(deleteOne findByIdAndDelete deleteMany)
注意没有delete
deleteOne findByIdAndDelete deleteMany
格式: userDB.deleteOne(condition)
// conditions: 查询条件
//查找age小于17的数据 删除找到的第一条
userDB.deleteOne({ age: { $lt: 17 } })
.then(res => {
console.log(res);
})
.catch((err) => { console.log(err); })