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

news2024/9/28 9:50:01

练习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/920692.html

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

相关文章

JavaFX笔记

设置透明 group.setOpacity(0.5);&#xff0c;这里给group设置了半透明&#xff0c;其中的组件也会跟着变化。 按钮的字体 按钮背景 麻烦方法 paint是颜色 CornerRadii是圆角的弧度 CSS方法 单击事件

java八股文面试[java基础]——反射

知识来源&#xff1a; 【23版面试突击】讲讲JAVA的反射机制_哔哩哔哩_bilibili

华为云服务器部署mysql

1. 下载mysql压缩包 本机是64位&#xff0c;直接用命令安装 msyql官网&#xff1a; https://dev.mysql.com/downloads/mysql/ 去网站看下所需的版本&#xff0c;修改下列命令 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-x86_64.tar.…

学习JAVA打卡第四十天

对象的字符串表示 在此类中我们讲过&#xff0c;所有的类都默认是java.lang包中object类的子类或间接子类。 Object类有一个public String toString&#xff08;&#xff09;方法,一个对象通过调用该方法可以获得该对象的字符串表示。一个对象调用toString法&#xff08;&…

vcomp140.dll丢失的修复方法分享,电脑提示vcomp140.dll丢失修复方法

今天&#xff0c;我的电脑出现了一个奇怪的问题&#xff0c;打开某些程序时总是提示“找不到vcomp140.dll文件”。这个问题让我非常头疼&#xff0c;因为我无法正常使用电脑上的一些重要软件。为了解决这个问题&#xff0c;我在网上查找了很多资料&#xff0c;并尝试了多种方法…

【面试经典150题】删除有序数组中的重复项-JavaScript版

题目链接 思路1&#xff1a;使用set。 /*** param {number[]} nums* return {number}*/ var removeDuplicates function(nums) {const uniqueSetnew Set();for(let i0;i<nums.length;i){uniqueSet.add(nums[i]);}const uniqueArrayArray.from(uniqueSet);nums.length0;nu…

【项目经理】项目管理杂谈

杂谈 1. 走上管理岗位&#xff0c;别再自己埋头干了2. 如何更好地管理项目进度3. 管理是“管事”而不是“管人”4. 让领导欣赏的十个沟通技巧在这里插入图片描述 1. 走上管理岗位&#xff0c;别再自己埋头干了 2. 如何更好地管理项目进度 3. 管理是“管事”而不是“管人” 4. 让…

书单背景图片怎么做?分享个手机轻松制作的方法

添加背景图片可以让书单变得更加吸引人&#xff0c;同时也能够让读者更好地理解该书单所代表的主题。在这篇文章中&#xff0c;我们将分享如何为书单添加背景图片&#xff0c;以及需要注意的地方。 如果你想在手机上把书单制作成视频的话&#xff0c;可以使用一些编辑应用&…

Docker容器学习:搭建ownCloud个人网盘

目录 前提环境 拉取镜像 创建容器 创建mysql容器&#xff1a; 创建OwnCloud容器&#xff0c;并连接到数据库&#xff1a; 创建Nginx容器&#xff1a; 配置nignx 前提环境 基于Centos7.9版本环境安装Docker-ce&#xff1a;24.0.5 拉取镜像 docker pull mysql:5.6 dock…

23年下半年软考系统架构设计师(最新报名时间)

高级系统架构设计师&#xff0c;有一定的难度&#xff0c;值得挑战一下 23年下半年软考架构启用最新版考试大纲&#xff0c;而且报名时间也推迟了&#xff0c;考试形式也改了&#xff0c;由笔试改为了机考&#xff0c;所以今年报名一定要多关注一下&#xff01;&#xff01; 软…

【LeetCode】167. 两数之和 II - 输入有序数组 - 双指针

目录标题 2023-8-23 09:25:08 2023-8-23 09:25:08 自己写的不是常量级的额外空间&#xff0c;但是写出来了&#xff0c;记录一下。 下次写的时候&#xff0c;请用双指针。 &#xff08;其实我想了想一想&#xff0c;双指针就没感觉出来&#xff1a;因为我只想到双指针两个都…

深度学习--LSTM网络、使用方法、实战情感分类问题

1.LSTM基础 长短期记忆网络&#xff08;Long Short-Term Memory&#xff0c;简称LSTM&#xff09;&#xff0c;是RNN的一种&#xff0c;为了解决RNN存在长期依赖问题而设计出来的。 LSTM的基本结构&#xff1a; 2.LSTM的具体说明 LSTM与RNN的结构相比&#xff0c;在参数更新…

聊一下最近有个网红铁头惩恶扬善举报新东方校外补课引起争议

最近有个网红&#xff0c;铁头打假&#xff0c;举报新东方校外补课上了热搜&#xff0c;引起了争议 最近他自己在一次直播带货当中&#xff0c;翻车了的 铁头敢端了学生的课桌&#xff0c;家长就敢掀了他的直播间 而因自己&#xff0c;我不用读书&#xff0c;我有社会经验&…

双碳目标下DNDC模型教程

详情点击链接&#xff1a;双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践技术应用教程 前沿 碳循环的精确模拟是实现“双碳”行动的关键。DNDC&#xff08;Denitrification-Decomposition&#xff0c;反硝化-分解模型&#…

前端三部曲之一HTML

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

同样都是手机卡,为什么线下的手机卡和线上的手机卡差距这么大?

大家好&#xff0c;我是搜卡之家&#xff0c;今天这篇文章就带大家了解一下线上流量卡和线下流量卡有哪些区别&#xff1f; ​ 众所周知&#xff0c;如果我们在营业厅办理流量业务&#xff0c;30G的流量不管是哪个运营商可能就需要将近100块钱&#xff0c;是为什么线上申请的流…

简单聊聊uniapp和uview组件库一起开发

简单的聊聊uniapp和uview组件库的开发 uniapp是一个基于Vue.js的跨平台开发框架&#xff0c;可以同时开发H5、微信小程序、App等多个平台的应用。这样可以减少开发人员的工作量&#xff0c;提高开发效率。 官网&#xff1a;https://uniapp.dcloud.net.cn/ uView是uni-app生态…

hive-列转行

转成 select customer_code,product_type from temp.temp_xx LATERAL VIEW explode(SPLIT(product_types,,)) table_tmp AS product_type where customer_code K100515182

DNS解析中的A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发等

DNS解析中的A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发等 1. DNS域名解析中添加的各项解析记录2. DNS解析中一些问题简要的介绍DNS 的 SOA记录&#xff1a;参考资料 域名注册完成后首先需要做域名解析&#xff0c;域名解析就是把域名指向网站所在…

数组习题答案

基础题目 第一题&#xff1a;需求实现 模拟大乐透号码&#xff1a; 一组大乐透号码由10个1-99之间的数字组成定义方法&#xff0c;打印大乐透号码信息 代码实现&#xff0c;效果如图所示&#xff1a; 开发提示&#xff1a; 使用数组保存录入的号码 参考答案&#xff1a; p…