2024年鸿蒙最新Nodejs---MongoDb的使用方式_nodejs mongodb 使用(1),2024年最新HarmonyOS鸿蒙面试题汇总

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

show dbs

2.查看当前指向的数据库

db

3.新建/切换数据库

use 数据库名称

4.查看数据库中所有集合

show collections

5.往集合中添加数据(若该集合不存在,则自动创建)

# db.集合名称.insert({添加的数据})

db.students.insert({name: '张三', age: '20', gender: '男'})

6.查看集合中所有的数据

# db.集合名称.find()
db.students.find().pretty()

7.删除当前数据库

db.dropDatabase()

8.创建集合

db.createCollection("集合名")

9.查看当前数据库中所有的表

show collections

10.删除当前数据库中指定的表

db.表名.drop()

可视化图形工具去操作 MongoDB(使用Navicat)

Nodejs 中去操作 MongoDB

mongoose

mongoose 是 Nodejs 中提供的一个用于便捷操作 MongoDB 的工具。

下载

npm i mongoose

mongoose 连接 MongoDB并设置数据库

// 通过 mongoose 去连接 MongoDB
// 数据库集合的相关配置
const mongoose = require('mongoose');
// 设置要连接的 MongoDB 服务器地址(studentsManage:要连接的数据库名称)
const dbURI = 'mongodb://localhost:27017/xiaoji';
// 连接数据库
mongoose.connect(dbURI, { useNewUrlParser: true, useUnifiedTopology: true });
//当数据库连接成功时触发此事件
mongoose.connection.on('connected', () => console.log(dbURI + ' 数据库连接成功'));

// Schema这个方法是一个构造函数,通过new创建这个构造方法的实例对象
// 这个方法用于定义数据库列名和值的类型
// 1.定义数据集合的结构:定义出集合中数据有哪些属性,属性的值是什么类型。
const usersSchema = new mongoose.Schema({
    username:String,
    password:Number,
    //下面这个为关联集合另一个集合的id值,当前集合列名为classid,值为另一个集合的id
    classid:{
    	//type:固定语法格式
		type: Schema.Types.ObjectId, 
		//ref用于设置另一集合的模型名称
		ref: 'schoolClass'
	}
})

//有的参数过时了,会有警告,下面这个代码可以无视警告
mongoose.set('strictQuery',false)

//2.定义数据集合的模型,将Schema和数据库中的集合关联起来
//model参数一:模型名称
//参数二:为上面的usersSchema
//参数三:数据库中的集合名称
const usersModel=mongoose.model('usersmodel',usersSchema,'users')
//接下来就是在各种请求里对数据进行增删改查操作了

注意以下所有的方法都是异步方法,且这些方法的返回值都是promise对象,因此需要通过await去等待操作结果,如下

mongodb所有的查询条件

//下面是mongodb所有的查询条件
$or 或关系
$nor 或关系取反
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$in 在多个值范围内
$nin 不在多个值范围内
$all 匹配数组中多个值
$regex 正则,用于模糊查询
$size 匹配数组大小
$maxDistance 范围查询,距离(基于LBS)
$mod 取模运算
$near 邻域查询,查询附近的位置(基于LBS)
$exists 字段是否存在
$elemMatch 匹配内数组内的元素
$within 范围查询(基于LBS)
$box 范围查询,矩形范围(基于LBS)
$center 范围醒询,圆形范围(基于LBS)
$centerSphere 范围查询,球形范围(基于LBS)
$slice 查询字段集合中的元素(比如从第几个之后,第N到第M个元素)
$options:'$i' 不区分大小写(涉及到英文单词可以加下)

根据条件查询
app.get('/login',async function(req,res){
	const result = await userModel.find({username:'123'})
})

模糊查询
app.get('/login',async function(req,res){
	const result = await userModel.find({
		 	username:{$regex :'萧',$options:'$i'}   //正则匹配查询所有带萧的username,英文字母不区分大小写
		})
})

查询所有
模型.find()

app.get("/select",async function(req,res){
    const user=req.query;//{username:'zs',password:'456'}
    console.log(user);
    // 查询集合中的数据
    // usersModel.find({username:'zs'})
    //在这里req.query为前端传来的数据,因此要查询的集合应该为req.query
    //find为异步方法,返回值为promise对象,解决方法使用aysnc\await
    const result=await usersModel.find()
    if(result.length>0){
        res.send({
            message:'查询所有成功',
            status:1
        })
    }else{
        res.send({
            message:'查询所有失败',
            status:1
        })
    }
    console.log('result',result);
})

根据id查询
findByid(id)//括号内传入id值即可

按条件查询
模型.find({查询条件})

app.get("/login",async function(req,res){
    const user=req.query;//{username:'zs',password:'456'}
    console.log(user);
    // 查询集合中的数据
    // usersModel.find({username:'zs'})
    //在这里req.query为前端传来的数据,因此要查询的集合应该为req.query
    //find为异步方法,返回值为promise对象,解决方法使用aysnc\await
    const result=await usersModel.find(user)
    //如果返回有数据则登陆成功,反之则失败
    if(result.length>0){
        res.send({
            message:'登陆成功',
            status:1
        })
    }else{
        res.send({
            message:'登陆失败',
            status:1
        })
    }
    console.log('result',result);
})

获取数据总条数
模型.countDocuments(可以为空,也可以给带条件的总条数)

分页查询
//limit() 参数为请求的条数
//skip() 跳过数据的条数
模型.limit().skip()

例如每页5条数据,当前在第3页
模型.limit(5).skip(10)

每页10条数据,当前在第2页
模型.limit(10).skip(10)

总结:每页n条数据,当前在第m页
模型.limit(n).skip( n \* (m-1) )

//注意:有时候前端传入数字类型数据到后端可能会被转换为字符串,而下面的参数都要求是number类型,因此需要进行一个转换
//可以通过多种方式转换number类型,这里不一一演示,推荐一个简单的转化,如下:(通过 -0 转化为number类型 )
模型.limit( 数据个数 - 0 ).skip( 跳过条数按照上面的公式有个乘运算,直接就number了,无需转换 )

拓展:计算总页数的方法

//先获取数据总条数
count total= await 模型.countDocuments()
//接下来计算总页数(需要考虑多出来的情况,例如除不尽有余数,因此这里需要采用向上取整)
const page = Math.ceil( total / 每页的数据条数 )

新增
模型.create({条件})
模型.create({username:'123',password:'123'})

升序降序
模型.find().sort(排序条件)

如下:
	将表的查询结果按照年龄排序。(1表示升序,-1表示降序)
模型.find().sort({age:1})

插入多条
模型.insertMany([
	{数据},
	{数据}
])

删除一个
模型.deleteOne({删除条件})

UserModel.deleteOne({id:1})

删除满足条件的所有
模型.deleteMony({删除条件})

UserModel.deleteOne({username:'zhangsan'})

根据id删除
findOneAndDelete({id值}) 删除单个文档,条件若是为空,默认删除第一条,删除成功返回被删除的数据,删除失败返回null

修改
模型.updateOne({查询条件}, {修改数据})

模型.updateOne({id:1}, {username:'lisi',password:'zhangs an'})

保存
模型.save() //无参数

关联查询
定义集合属性字段时,需加入以下代码
   //下面这个为关联集合另一个集合的id值,当前集合列名为classid,值为另一个集合的id
    classid:{
    	//type:固定语法格式
		type: Schema.Types.ObjectId, 
		//ref用于设置另一集合的模型名称
		ref: 'schoolClass'
	}

根据关联的id查找另一个集合的数据
//populate用于关联查询
当前绑定的模型.find().populate('当前模型作关联的列名')
//此时返回的数据会是[Object Object]格式
//通过获得的对象打点访问第二个模型的属性列名
//例如被关联的模型有个uaername列名,如果想访问就在获取到数据时通过.username获取到具体数据

populate嵌套关联查询
例如学生管理系统---学生关联班级,班级又关联教师,那么如何从学生找到对应的教师呢??
那就需要使用嵌套关联查询了,格式如下:

当前学生的模型.find().populate({
	path:'当前学生绑定的班级的id的外键列名',
	populate:{
		path:'班级绑定的教师id的外键列名'
	}
})

//通过获得的对象打点访问第三个模型教师的属性列名,如下格式获取:
格式为:
	data:{
		id:1
		name:"学生"
		classid:{
			id:1,
			name:"班级"
			teacherid:{
				name:"老师",
				age:25
			}
		}
	}
//返回的学生数据.学生关联的班级外键名.班级关联的教师外键名.需要得到的教师具体属性

populate并列关联查询
例如学生管理系统---学生关联班级,学生又关联教师,那么如何从学生找到班级和对应的教师呢??
那就需要使用并列关联查询了,格式如下:

当前学生的模型.find().populate('当前学生绑定的班级的id的外键列名').populate('当前学生绑定的教师的id的外键列名')

直接连续调用即可

详细教程

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

例如学生管理系统---学生关联班级,学生又关联教师,那么如何从学生找到班级和对应的教师呢??
那就需要使用并列关联查询了,格式如下:

当前学生的模型.find().populate('当前学生绑定的班级的id的外键列名').populate('当前学生绑定的教师的id的外键列名')

直接连续调用即可

详细教程

[外链图片转存中…(img-TmLpMLSJ-1715742720440)]
[外链图片转存中…(img-bTr4nZDS-1715742720440)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值