当前位置: 首页 > news >正文

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卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…...

【Unity自制手册】游戏基础API大全

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…...

【LVS】4、HAProxy搭建web集群

目前常见的Web集群调度器分为软件和硬件 软件通常使用开源的LVS、Haproxy、Nginx LVS性能最好&#xff08;基于内核转发&#xff09;&#xff0c;但是搭建相对复杂&#xff1b;Nginx的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xff0c;高并发性…...

【应用层】网络基础 -- HTTP协议

再谈协议HTTP协议认识URLurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见HeaderHTTP周边会话保持 再谈协议 协议是一种 “约定”. socket api的接口&#xff0c;在读写数据时&#xff0c;都是按 “字符串” 的方式来发送接收的(tcp是以字节流的方式发送的&am…...

【线性DP】模型总结(terse版)

【线性DP】模型总结 最长上升子序列 DP法 ​ dp[i]表示以i结尾的最长上升子序列的长度。 ​ 对于每个i&#xff0c;遍历j1~i-1,若a[j] < a[i], 则dp[i] max(dp[i], dp[j] 1); 二分法 ​ 可以优化时间复杂度。 ​ dp[]数组用来存储当前最长上升子序列。 ​ 若dp[]数…...

conda 常用命令

conda 常用命令 一、创建环境二、删除环境三、环境重命名四 、查看环境列表五、进入某个虚拟环境六、退出当前环境七、查看当前虚拟环境下的所有安装包八、安装或卸载包(进入虚拟环境之后&#xff09;九、分享虚拟环境十、源服务器管理十一、升级十二、卸载十三、卸载十四、pip…...

前端面试:【异步编程】Callback、Promise和Async/Await

嗨&#xff0c;亲爱的JavaScript探险家&#xff01;在JavaScript开发的旅程中&#xff0c;你会经常遇到异步编程的需求。为了处理异步操作&#xff0c;JavaScript提供了多种机制&#xff0c;包括Callbacks、Promises和Async/Await。本文将深入介绍这些机制&#xff0c;让你能够…...

大数据(四):Pandas的基础应用详解

专栏介绍 结合自身经验和内部资料总结的Python教程&#xff0c;每天3-5章&#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发&#xff0c;学完了定能成为大佬&#xff01;加油吧&#xff01;卷起来&#xff01; 全部文章请访问专栏&#xff1a;《Python全栈教…...

计算机网络第3章(数据链路层)

计算机网络第3章&#xff08;数据链路层&#xff09; 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.时钟体系(给单片机提供一个非常稳定的频率信号) ①可以使用三种不同的时钟源来驱动系统时钟&#xff08;SYSCLK&#xff09;&#xff0c;CPU运行的频率为168MHZ&#xff1b; HSI(RC振荡器时钟&#xff0c;也就是高速内部时钟&#xff0c;一般来说很少用&#xff0c;因为精度…...

RPC和HTTP协议

RPC 全称&#xff08;Remote Procedure Call&#xff09;&#xff0c;它是一种针对跨进程或者跨网络节点的应用之间的远程过程调用协议。 它的核心目标是&#xff0c;让开发人员在进行远程方法调用的时候&#xff0c;就像调用本地方法一样&#xff0c;不需要额外为了完成这个交…...

BUGFix:onnx -> TensorRT转换过程失败

先附上相关的onnx2trt的部分代码&#xff1a; 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&#xff0c;i.e 000…...

个性定制还是纯粹简约:探寻界面选择背后的心理宇宙

在数码世界中&#xff0c;我们的界面选择成为了一张架起的桥梁&#xff0c;连接着个性的渴望与效率的追求。当我们面对个性化定制界面和极简版原装界面&#xff0c;我们仿佛站在了一座分岔路口&#xff0c;左右各有一片令人心驰神往的风景。究竟是走向五光十色的个性世界&#…...

【Java 高阶】一文精通 Spring MVC - 转发重定向(四)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…...

嵌入式Linux开发实操(十):ADC接口开发

#前言 ADC就是模数转换,可以用来接一些模拟量设备,所谓模拟量就是波形不是方波而是各种包络形状的波形的信号,比如电压、电流等电信号或压力、温度、湿度、位移、声音等非电信号,ADC就是将这些信号转换为数字方波信号,以便于信息传递的。 #ADC硬件设计 key按键连接了AD…...

精进语言模型:探索LLM Training微调与奖励模型技术的新途径

大语言模型训练&#xff08;LLM Training&#xff09; LLMs Trainer 是一个旨在帮助人们从零开始训练大模型的仓库&#xff0c;该仓库最早参考自 Open-Llama&#xff0c;并在其基础上进行扩充。 有关 LLM 训练流程的更多细节可以参考 【LLM】从零开始训练大模型。 使用仓库之…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...