MongDB【CRUD练习-条件查询-文档关系】

news2024/12/28 11:28:20

练习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});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/903305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信号处理--基于EEG脑电信号的眼睛状态的分析

本实验为生物信息学专题设计小项目。项目目的是通过提供的14导联EEG 脑电信号&#xff0c;实现对于人体睁眼和闭眼两个状态的数据分类分析。每个脑电信号的时长大约为117秒。 目录 加载相关的库函数 读取脑电信号数据并查看数据的属性 绘制脑电多通道连接矩阵 绘制两类数据…

《强化学习:原理与Python实战》——可曾听闻RLHF

前言&#xff1a; RLHF&#xff08;Reinforcement Learning with Human Feedback&#xff0c;人类反馈强化学习&#xff09;是一种基于强化学习的算法&#xff0c;通过结合人类专家的知识和经验来优化智能体的学习效果。它不仅考虑智能体的行为奖励&#xff0c;还融合了人类专家…

LeetCode算法递归类—二叉树的右视图

目录 199. 二叉树的右视图 题解&#xff1a; 目标&#xff1a; 思路&#xff1a; 过程&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所…

使用渲染纹理(RenderTexture)来实现3D视觉

如上图的效果&#xff0c;使用2D场景&#xff0c;通过摄像头的改动&#xff0c;使其看起来像是3D效果一样。 Nintendo Switch上刚推出的《超级马里奥》中&#xff0c;有一些关卡混合了2D和3D的画面&#xff0c; 一般来说&#xff0c;摄像机会直接渲染到电脑屏幕&#xff1b;…

【C语言练习】数组OJ题

目录 一.消失的数字思路1&#xff1a;思路2&#xff1a; 二.移除元素三.轮转数组四.删除有序数组中的重复项五.合并两个有序数组 一.消失的数字 题目&#xff1a; 思路1&#xff1a; 数组是从0加到N&#xff0c;所以把0到N的数加起来减去数组中的值&#xff0c;结果就是消失…

阿里云ECS服务器和轻量应用服务器区别?怎么选择?

阿里云轻量应用服务器和云服务器ECS有什么区别&#xff1f;ECS是专业级云服务器&#xff0c;轻量应用服务器是轻量级服务器&#xff0c;轻量服务器使用门槛更低&#xff0c;适合个人开发者或中小企业新手使用&#xff0c;可视化运维&#xff0c;云服务器ECS适合集群类、高可用、…

Cadence 仿真

电路的学习离不开仿真和实践&#xff0c;主流的仿真软件有很多&#xff0c;有用功pretues和mutisim&#xff0c;这次主要是工作中使用cadence&#xff0c;而且带有比较强大的仿真工具Pspice&#xff0c;所以选择了它 &#xff0c;我使用的版本是cadence 17.4自带的。官方提供了…

ViT模型架构和CNN区别

目录 Vision Transformer如何工作 ViT模型架构 ViT工作原理解析 步骤1&#xff1a;将图片转换成patches序列 步骤2&#xff1a;将patches铺平 步骤3&#xff1a;添加Position embedding 步骤4&#xff1a;添加class token 步骤5&#xff1a;输入Transformer Encoder 步…

leetcode 213. 打家劫舍 II

2023.8.20 本题是 打家劫舍 的进阶版&#xff0c;房屋之间形成一个环了&#xff0c;也就是第一个房屋和最后一个房屋不能一起偷了。那么能偷的情况分为下列三种&#xff1a; 不考虑偷首房间。不考虑偷尾房间。不考虑偷首尾房间。 第三种情况包含于第一和第二种情况了&#xff…

CSerialPort教程4.3.x (1) - CSerialPort项目简介

CSerialPort教程4.3.x (1) - CSerialPort项目简介 前言 CSerialPort项目是一个基于C/C的轻量级开源跨平台串口类库&#xff0c;可以轻松实现跨平台多操作系统的串口读写&#xff0c;同时还支持C#, Java, Python, Node.js等。 CSerialPort项目的开源协议自 V3.0.0.171216 版本…

分组与引用:用正则实现更复杂的查找和替换操作

括号在正则中的功能就是用于分组。简单来理解就是&#xff0c;由多个元字符组成某个部分&#xff0c;应该被看成一个整体的时候&#xff0c;可以用括号括起来表示一个整体&#xff0c;这是括号的一个重要功能。其实用括号括起来还有另外一个作用&#xff0c;那就是“复用”。 …

Linux 线程同步——信号量

一、线程同步的概念 这里的同步就是对程序的执行进行控制&#xff0c;因为如果不进行控制就会出现错误的问题&#xff0c;这里的控制是为了保证程序的正确性。 线程同步指的是当一个线程在对某个临界资源进行操作时&#xff0c;其他线程都不可以对这个资源进行操作&#xff0…

json文件读取数据报错 AttributeError: ‘str‘ object has no attribute ‘items‘

trans_width_table表如下&#xff1a; {frozenset({2}): {3: 250, 2.5: 100, 1.5: 25, 2: 50, 1.8: 50, 2.75: 200, 5: 350, 4: 350, 2.3: 100, 4.5: 350, 3.5: 300}, frozenset({1, 3, 4, 5}): {2.5: 75, 2.75: 100, 1.5: 25, 4: 300, 3.5: 200, 4.5: 300, 3: 100, 5: 300, 2…

沁恒ch32V208处理器开发(六)BLE开发

目录 概述任务初始化任务的调度执行TMOS 处理事件方法 概述 CH32V 系列是基于青稞 32 位 RISC-V 设计的工业级通用微控制器&#xff0c;片上集成 2Mbps 低功耗蓝牙通讯模块&#xff0c;支持低功耗蓝牙 BLE5.x&#xff0c;低功耗蓝牙协议栈以及应用均基于 TMOS&#xff08;Task…

光电比赛小车寻宝【1】--循迹策略

2023光电比赛总结&#xff1a;主要功能实现了&#xff0c;就是视频没做好&#xff0c;落选了非常的遗憾&#xff0c;也有很多的不甘心&#xff0c;也可以作为最后摆烂的惩罚吧&#xff0c;在这里总结一下经验教训。整体感觉时间不是非常充分&#xff0c;因为得到比赛的消息后突…

Linux之管理逻辑卷

目录 管理逻辑卷 认识LInux逻辑卷 LVM基本概念 部署逻辑卷 常用LVM部署命令 案例 管理与调整LVM卷 1.扩展卷组——添加/dev/nvme0n2p4物理卷到vg01中 2.在线扩展逻辑卷 管理逻辑卷 逻辑卷管理器是Linux 系统用于对硬盘分区进行管理的一种机制&#xff0c; 理论性较强 &…

安装搭建私有仓库 Harbor

目录 一. 准备环境 1.1安装 Docker 1.2安装 Docker Compose 二. 下载 Harbor 安装包 三. 解压安装包 四. 配置 Harbor 五. 安装 Harbor 六. 访问 Harbor 七. 创建项目、用户和角色 一. 准备环境 确保您的服务器满足 Harbor 的系统要求。最低要求是至少 2 核 CPU、4GB…

【沁恒蓝牙mesh】CH58x串口环形FIFO数据处理

本文章主要针对沁恒科技的CH58x芯片&#xff0c;以 BLE_UART 工程为依托&#xff0c;介绍串口数据的接收与处理。 该工程中 串口数据的处理用到了环形FIFO机制&#xff0c;可作为其他开发工具 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我…

【LLM数据篇】预训练数据集+指令生成sft数据集

note 在《Aligning Large Language Models with Human: A Survey》综述中对LLM数据分类为典型的人工标注数据、self-instruct数据集等优秀的开源sft数据集&#xff1a;alpaca_data、belle、千言数据集、firefly、moss-003-sft-data多轮对话数据集等 文章目录 note构造指令实例…

k8s扩缩容与滚动更新

使用kubectl run创建应用 kubectl run kubernetes-bootcamp \> --imagedocker.io/jocatalin/kubernetes-bootcamp:v1 \> --port8080 端口暴露出去 kubectl expose pod kubernetes-bootcamp --type"NodePort" --port 8080 使用kubectl create创建应用 kubect…