MongoDB【CRUD练习-条件查询-文档关系】
练习1-CRUD
// 进入test数据库
use test;
// 查询文档内容
db.students.find();
// 显示当前数据库中所有集合
show collections;
// 向数据库的user集合中插入一个文档
db.users.insertOne({username: "lyh"}
);
// 查看当前数据库中所有的集合 发现users集合被创建
show collections;
// 查看users集合中所有文档
db.users.find();
// 向users集合中插入一个文档
db.users.insertOne({username: "sxau"}
);
// 查看users集合中所有文档
db.users.find();
// 统计users集合中文档的数量
db.users.find().count();
// 查询集合users中username为lyh的文档
db.users.find({username: "lyh"});
// 向users集合中username为lyh的文档添加一个address属性,属性值为shanxi
db.users.updateOne({username: "lyh"},{$set:{address: "shanxi"}}
);
// 使用 {username:"lj"} 替换 username 为 sxau 的文档
db.users.replaceOne({username: "sxau"},{username: "lj"}
);// 删除username为lyh的address属性
db.users.updateOne({username: "lyh"},{$unset: {address: 404}}
);// 向username为lyh的文档中添加一个hobby属性:{cities["chengdu","xian"],sport:["basketball","football"]}
// mongdb文档(document)的属性值也可以是一个文档,当一个文档的属性值是一个文档的时候,我们称这个文档叫做内嵌文档
// 比如下面我们的这个文档中又存放了一个名为hobby的文档,它有两个属性:cities和sport
db.users.updateOne({username: "lyh"},{$set: {hobby:{cities:["chengdu","xian"],sports:["basketball","football"]}}}
);// 向username为lj的文档中添加一个hobby属性:{sport:["basketball","sing"]}
db.users.updateOne({username: "lj"},{$set: {hobby: {sport:["basketball","sing"]}}}
);// 查询 喜欢basketball 运动的文档
// MongDB 支持对内嵌文档进行查询 查询的时候属性名必须加引号 单引号和双引号都行
db.users.find({"hobby.sport":"basketball"}
);// 向lj的sport的中添加一个"pingpang"
// 这里用 $push 而不是 $set push是向数组中添加一个新的元素
// push 可以给数组添加重复的元素 但是下面的set不会
db.users.updateOne({username: "lj"},{$push:{"hobby.sport": "pingpang"}}
);db.users.find();// 除了 $push 还可以用 $addToSet 表示添加到集合 和push的区别就是
// addToSet 会把我们的数组当做一个set集合来看待 它不可以添加重复的元素
db.users.updateOne({username: "lj"},{$addToSet:{"hobby.sport": "pingpang"}}
);// 删除喜欢 sing 的用户
db.users.deleteOne({"hobby.sport": "sing"}
);
练习2-条件查询
- 这里会学习到一个数据类型:数组,这里的语法和JavaScript十分相似。数组使用push来添加数据。
- 这里还会学到比较运算符:小于:lt ,等于:eq,大于: gt,小于等于: lte,大于等于: gte。和我们shell编程的比较运算符很像。
// 向 numbers 插入20000条数据 耗时十几秒
for(var i=1;i<=20000;i++){db.numbers.insertOne({num:i});
};db.numbers.find();// 删除只需要0.2s
db.numbers.drop();// 使用数组存储2w条数据 只调用一次insert方法
var arr = [];for(var i=1;i<=20000;i++){arr.push({num: i});
};
// 这次只用了 1s
db.numbers.insertMany(arr); //插入数组需要使用insertMany而不是insertOne 后者会插入2w个列族db.numbers.find();// 查询numbers中num为500的文档
db.numbers.find({num: 500}
);
// 查询numbers中num大于18888的文档
db.numbers.find({num: {$gt: 18888}}
);
// 查询numbers中num小于等于30的文档
db.numbers.find({num:{$lte: 30}}
);
// 查询numbers集合中num等于77的文档
db.numbers.find({num:{$eq: 77}}
);
// 查询numbers中num大于50小于70的文档
db.numbers.find({num:{$gt:50,$lt: 70}}
);
// 查询numbers中的前10条文档
db.numbers.find().limit(10);
// 实际开发过程中我们不可能使用没有查询条件的查询 加载时间长 我们都是分页加载的 而且即使不考虑服务器的性能 还有网速的影响 而且用户也看不完那么多数据 用户的内存也存不了
db.numbers.find();
// 查询numbers中的第10条到第20条文档
// skip() 用于跳过指定数量的数据
db.numbers.find().skip(10).limit(10);
// 查询numbers中的第21条到第30条文档
db.numbers.find().skip(20).limit(10);
// mongdb 会自动调整我们 limit和skip方法的顺序 下面的语句执行时其实还是 db.numbers.find().skip(20).limit(10);
db.numbers.find().limit(10).skip(20);
文档之间的关系
文档之间有三种:
- 一对一
- 夫妻
- 一对多/多对一
- 文章和评论
- 多对多
- 老师和学生
这些都可以通过内嵌文档来映射。
一对一
// 李元芳是狄如燕的丈夫 注意:插入多个文档或者一个数组时需要使用insertMany
db.wifeAndHusband.insertMany([{name: "狄如燕",husband:{name: "李元芳"}},{name: "红太狼",husband:{name: "灰太狼"}}]
);

一对多
//一对多 一篇文章对多个评论
db.article.insertOne({name: "《沉默的大多数》",comments: ["很好看","给王小波点赞","神作"]}
);db.article.find();// 增加字段 'author' 并赋值为 '王小波' 给所有含有 'name' 属性的文档
db.article.updateMany({name: {$exists: true}},{$set: {author: "王小波"}}
);
db.article.insertOne({name: "《祈念守护人》",author: "东野圭吾",'comments': ["很治愈","好看","力推"]}
);

如果非要严格的说相同的评论内容可以对应多个作者的话,也可以算是多对多。
多对多
// 多对多
db.teachers.insertMany([{name: "狄仁杰"},{name: "曾泰"},{name: "李元芳"}
]);db.students.insertMany({name: "狄春",age: 22,isDel: 0,gender: "男"},{name: "狄如燕",age: 20,isDel: 0,gender: "女"}
);//添加字段 teacher_ids 与teachers 产生关联
db.students.updateOne({name: "狄春"},{$set:{teacher_ids:[ObjectId("64e17b707867901a96e5f81e"),ObjectId("64e17b707867901a96e5f820")]}}
);

练习3-条件查询
- 这里我们会学到一个新的关键字:$inc 是自增的意思,需要指定增加的值。
数据源:dept(部门表),emp(员工表)
b.dept.insertMany([{deptno: 1001,dname: "财务部",loc: "北京"},{deptno: 1002,dname: "办公室",loc: "上海"},{deptno: 1003,dname: "销售部",loc: "成都"},{deptno: 1004,dname: "运营部",loc: "西安"}
]);db.emp.insertMany([{empno: 7001,ename: "光头强",job: "伐木工",depno: 1004,sal: 800},{empno: 7001,ename: "熊大",job: "护林员",depno: 1004,sal: 100},{empno: 7001,ename: "熊二",job: "护林员",depno: 1004,sal: 500},{empno: 7001,ename: "吉吉",job: "老板",depno: 1001,sal: 7000},{empno: 7001,ename: "毛毛",job: "会计",depno: 1002,sal: 2000},{empno: 7001,ename: "二狗",job: "保安",depno: 1003,sal: 1000},{empno: 7001,ename: "大马猴",job: "保安",depno: 1003,sal: 1000}
]);
- 工资小于1100
db.emp.find({sal: {$lt: 1100}}
);

- 工资在500-1000
db.emp.find({sal: {$gt: 500,$lt: 1000}}
);

- 工资小于1000或者大于2000
db.emp.find({$or:[{sal: {$lt: 1000}},{sal: {$gt: 2000}}]}
);

- 查询运营部所有员工
// 查询运营部所有员工
var depno = db.dept.findOne({dname: "运营部"}
).deptno;
db.emp.find({depno: depno}
);

- 给所有工资低于1000的员工增加500元工资
// 给所有工资低于1000的员工增加500元工资
db.emp.updateMany({sal: {$lte: 1000}},{$inc:{sal: 500}}
);
这里使用了一个新的关键字:inc 代表 increase:自增的意思,如果我们要做减法的话,可以令增加的值为负数。
sort和投影
- sort 是默认按照 _id 进行排序的,可以根据设置指定的字段来排序,需要以对象的格式来设置参数(中括号{字段名: 1},1代表升序,-1代表降序)。
- 投影的是设置查询结果中显示的字段,需要设置find()中的参数,同样是对象的格式(中括号{自字段名:1},1代表显示,0代表不显示),其中,_id 默认是显示的。
//默认按照 _id 来进行排序
db.emp.find();// 按照工资来升序排序 sort()需要一个对象来指定排序规则 1: 升序 -1: 降序
db.emp.find().sort({sal:1});// 先按照工资来排序,如果工资相同则按照empno排序
// limit skip 和 sort 都可以以任意顺序调用
db.emp.find().sort({sal:1,empno:-1});// 指定查询结果字段 也就是find的第二个参数 是一个对象 1代表显示 0代表不显示 _id默认显示
db.emp.find({},{ename: 1,_id: 0});相关文章:
MongoDB【CRUD练习-条件查询-文档关系】
练习1-CRUD // 进入test数据库 use test; // 查询文档内容 db.students.find(); // 显示当前数据库中所有集合 show collections; // 向数据库的user集合中插入一个文档 db.users.insertOne({username: "lyh"} ); // 查看当前数据库中所有的集合 发现users集合被创建…...
使用M2Mqtt 接受以及发布MQTT消息
在NuGet库里面直接查找M2Mqtt就可以安装库。 使用framework4.5.2 1.配置文件操作 public static class GModel{public static BassSetup MainSetup { get; set; }public static void GetThisAdd(){MainSetup new BassSetup();string IPAdd ConfigurationManager.AppSettings…...
【SA8295P 源码分析】33 - Android GVM USB 透传配置
【SA8295P 源码分析】33 - Android GVM USB 透传配置 1. QNX 侧配置 USB1 为 GVM 使用2. Android 端配置 dts:以配置 USB1 为例3. QNX 端配置 linux-la.config:以配置 USB1 为例4. 在Android shell 中配置USB0 / USB1 的 Host/device 模式切换系列文章汇总见:《【SA8295P 源…...
华为OD机试 - 过滤组合字符串 - 深度优先搜索dfs算法(Java 2023 B卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…...
【Unity自制手册】游戏基础API大全
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
【LVS】4、HAProxy搭建web集群
目前常见的Web集群调度器分为软件和硬件 软件通常使用开源的LVS、Haproxy、Nginx LVS性能最好(基于内核转发),但是搭建相对复杂;Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性…...
【应用层】网络基础 -- HTTP协议
再谈协议HTTP协议认识URLurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见HeaderHTTP周边会话保持 再谈协议 协议是一种 “约定”. socket api的接口,在读写数据时,都是按 “字符串” 的方式来发送接收的(tcp是以字节流的方式发送的&am…...
【线性DP】模型总结(terse版)
【线性DP】模型总结 最长上升子序列 DP法 dp[i]表示以i结尾的最长上升子序列的长度。 对于每个i,遍历j1~i-1,若a[j] < a[i], 则dp[i] max(dp[i], dp[j] 1); 二分法 可以优化时间复杂度。 dp[]数组用来存储当前最长上升子序列。 若dp[]数…...
conda 常用命令
conda 常用命令 一、创建环境二、删除环境三、环境重命名四 、查看环境列表五、进入某个虚拟环境六、退出当前环境七、查看当前虚拟环境下的所有安装包八、安装或卸载包(进入虚拟环境之后)九、分享虚拟环境十、源服务器管理十一、升级十二、卸载十三、卸载十四、pip…...
前端面试:【异步编程】Callback、Promise和Async/Await
嗨,亲爱的JavaScript探险家!在JavaScript开发的旅程中,你会经常遇到异步编程的需求。为了处理异步操作,JavaScript提供了多种机制,包括Callbacks、Promises和Async/Await。本文将深入介绍这些机制,让你能够…...
大数据(四):Pandas的基础应用详解
专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教…...
计算机网络第3章(数据链路层)
计算机网络第3章(数据链路层) 3.1 数据链路层概述3.1.1 概述3.1.2 数据链路层使用的信道3.1.3 三个重要问题 3.2 封装成帧3.2.1 介绍3.2.2 透明传输3.2.3 总结 3.3 差错检测3.3.1 介绍3.3.2 奇偶校验3.3.3 循环冗余校验CRC(Cyclic Redundancy Check)3.3.…...
stm32之4.时钟体系
3.时钟体系(给单片机提供一个非常稳定的频率信号) ①可以使用三种不同的时钟源来驱动系统时钟(SYSCLK),CPU运行的频率为168MHZ; HSI(RC振荡器时钟,也就是高速内部时钟,一般来说很少用,因为精度…...
RPC和HTTP协议
RPC 全称(Remote Procedure Call),它是一种针对跨进程或者跨网络节点的应用之间的远程过程调用协议。 它的核心目标是,让开发人员在进行远程方法调用的时候,就像调用本地方法一样,不需要额外为了完成这个交…...
BUGFix:onnx -> TensorRT转换过程失败
先附上相关的onnx2trt的部分代码: def onnx2trt(onnx_path):logger trt.Logger(trt.Logger.ERROR)builder trt.Builder(logger)network builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))parser trt.OnnxParser(netw…...
FFMPEG小白常用命令行
序列帧转H264视频 ffmpeg -r 60 -f image2 -s 1920x1080 -i fram%d.jpg -vcodec libx264 -crf 25 -pix_fmt yuv420p test.mp4 -vcodec h264 .\ffmpeg -r 60 -f image2 -s 1920x1080 -i %04d.jpeg -vcodec h264 test.mp4 %04d 表示用零来填充直到长度为4,i.e 000…...
个性定制还是纯粹简约:探寻界面选择背后的心理宇宙
在数码世界中,我们的界面选择成为了一张架起的桥梁,连接着个性的渴望与效率的追求。当我们面对个性化定制界面和极简版原装界面,我们仿佛站在了一座分岔路口,左右各有一片令人心驰神往的风景。究竟是走向五光十色的个性世界&#…...
【Java 高阶】一文精通 Spring MVC - 转发重定向(四)
👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…...
嵌入式Linux开发实操(十):ADC接口开发
#前言 ADC就是模数转换,可以用来接一些模拟量设备,所谓模拟量就是波形不是方波而是各种包络形状的波形的信号,比如电压、电流等电信号或压力、温度、湿度、位移、声音等非电信号,ADC就是将这些信号转换为数字方波信号,以便于信息传递的。 #ADC硬件设计 key按键连接了AD…...
精进语言模型:探索LLM Training微调与奖励模型技术的新途径
大语言模型训练(LLM Training) LLMs Trainer 是一个旨在帮助人们从零开始训练大模型的仓库,该仓库最早参考自 Open-Llama,并在其基础上进行扩充。 有关 LLM 训练流程的更多细节可以参考 【LLM】从零开始训练大模型。 使用仓库之…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
