MongoDB基础学习

文章目录

    • 一、数据库
      • 1. 概念介绍
      • 2. 数据库分类
    • 二、MongoDB入门
      • 1. 简介
      • 2. MongoDB的基本操作
      • 3. MongoDB文档间的关系
      • 4. Sort和投影

一、数据库

1. 概念介绍

数据库是按照数据结构来组织、存储和管理数据的仓库。我们的程序在内存中运行,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失所以我们需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。而数据库就是数据持久化的最佳选择。说白了数据库就是存储数据的仓库。

2. 数据库分类

数据库主要分成两种:

  • 关系型数据库(RDBMS):MySQL、Oracle、DB2、SQL Server…(关系型数据库中全是表)
  • 非关系型数据库(No SQL):MongoDB(文档数据库)、Redis(键值对数据库)…

二、MongoDB入门

1. 简介

MongoDB是为快速开发互联网Web应用而设计的数据库系统。MongoDB设计目标是及简、灵活、作为Web应用栈的一部分,它的数据模型是面向文档的,所谓文档是一种类似JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON(BSON)。

MongoDB数据库分为两个部分,分别是数据库服务器,它是用来保存数据的;另一部分是数据库客户端,数据库客户端用来操作服务器,对数据进行增删改查。

MongoDB的安装和图形化界面安装就在这里不演示了,网上相关资源比较多

MongoDB有三个基本概念:

  • 数据库:数据库是一个仓库,在仓库中可以存放集合
  • 集合:集合就是一组文档,也就是集合是用来存放文档的,集合中存储的文档可以是各种各样的,没有格式要求
  • 文档:文档数据库中的最小单位,我们存储和操作的内容都是文档

多个文档组成集合,多个集合组成数据库

在这里插入图片描述

2. MongoDB的基本操作

  • 首先用客户端打开并连接到MongoDB

在这里插入图片描述

  • 查看当前服务器有多少数据库
show dbs

在这里插入图片描述

可以看到当前有三个数据库,分别为admin、config、local

  • 进入并使用指定数据库
use test #test是数据库名

在mongoDB中数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建,具体的创建时间时我们第一次向数据库中插入文档的时候创建。

db

db命令可以查看当前我们的数据库名

show collections

查看当前数据库中所有集合

在这里插入图片描述

  • 数据库的CRUD的操作

向数据库中插入数据

#插入多条数据
db.stus.insert([{name:"wohao",age:18,gender:"男"},{name:"nihao",age:23,gender:"男"}]);

在这里插入图片描述

#查询插入的数据
db.stus.find();

在这里插入图片描述

发现相比我们添加的字段,数据库中的字段多了一个_id字段,这是因为,当我们向集合中插入文档的时候,如果没有给文档指定_id属性,则数据库会自动为文档添加一个_id,作为该文档的唯一标识(根据时间戳生成,有点和雪花算法类似)

我们可以自己生成ID

ObjectId()

在这里插入图片描述
当然我们可以自己指定,但要自己确保唯一性

db.stus.insert({_id:"hello",name:"wohao",age:18,gender:"男"});

insertOne():插入一个文档
insertMany():插入多个文档

上面两个方法是3.2后新加的

向数据库中查询数据

#查询stus集合中的所有文档
db.stus.find();

在这里插入图片描述

find()的作用是查询集合中所有符合条件的文档,如果不提供条件默认就是查询所有文档,find()可以接受一个对象作为查询条件

#查询姓名为"wohao"的文档
db.stus.find({name:"wohao"})

在这里插入图片描述

上面查询的语法为find({属性名:属性值,属性名:属性值})

db.stus.findOne({name:"wohao"})

在这里插入图片描述

findOne({....})用来查询集合中符合条件的第一个文档

上面同样可以用下面代码实现,因为find()本质上返回的是一个数组,而findOne返回的是一个对象

修改数据库中的数据

db.stus.update({ name: "wohao" }, { $set: {age: 100} });

update(查询条件,新对象),update默认情况下会使用新对象来替换旧对象

在这里插入图片描述

只修改了第一条数据,其中$set是原子操作符,表示修改,update()默认情况下只会修改一个数据

db.stus.update({ name: "wohao" }, { $unset: {age: 100} });

在这里插入图片描述

unset表示删除一个指定的属性

#同时修改多个符合条件的文档
db.stus.updateMany({name:"wohao"},{ $set: {name:"张飞"}})   ;
#同时修改一个符合条件的文档
db.stus.updateOne():

在这里插入图片描述
实际上update()函数也是可以修改多个的,只要设置参数即可
在这里插入图片描述


db.stus.update({ name: "nihao" }, { $set: {name: "关羽"} },{multi:true});

在这里插入图片描述

#用于替换一个文档
db.stus.replaceOne();

删除数据库中的数据

首先记录一下原先数据库中的数据
在这里插入图片描述

#删除name为jack的文档
db.stus.remove({name="jack"});

在这里插入图片描述

remove()可以根据条件来删除文档,传递的条件的方式和find()一样,remove是可以删除所有匹配的文档的,指定参数可以只删一个

在这里插入图片描述

#删除一个匹配到的文档
db.stus.remove({name="jack"},true);
#删除全部文档,这种清空集合的方式效率比较低,因为它要一条一条的删除集合中的数据
db.stus.remove({});
#删除stus集合
db.stus.drop()
#删除数据库
db.dropDatabase();

一般数据库中的数据都不会删除,所以删除的方法很少调用,在实际开发过程中我们会在表中添加一个字段,来实现逻辑删除,如下图isDelete就表示数据是否被删除。,

3. MongoDB文档间的关系

MongoDB文档间的关系主要分为三种:

  • 一对一

例如夫妻关系是一对一,在MongoDB中可以通过内嵌文档的形式来显示一对一的关系

#文档中间嵌入文档
db.wifeAndhusband.insert({name:"xiaomei",hunsband:{name:"xiaoshuai"}});

在这里插入图片描述

  • 一对多/多对一

这种情况是最多的,例如用户和订单就是一种典型的一对多的关系,在MongoDB中这种关系的体现形式如下

#创建user集合db.users.insert([{_id:1,name:"java"},{_id:2,name:"python"}]);

在这里插入图片描述

#创建订单集合
db.Orders.insert([{list: ["pg","xj","yl"],user_id: 1},{list: ["pg","xj","yl"],user_id: 2}]);

在这里插入图片描述

#查询java的订单var user_id=db.users.findOne({name:"java"})._id;db.Orders.find({user_id:user_id});

在这里插入图片描述

  • 多对多

例如老师和学生的关系就是多对多的关系

首先创建老师

  db.teacher.insert([{name:"th"},{name:"tw"},{name:"tl"}])

然后创建学生

  db.student.insert([{name:"xiaoli",teach_id:[ObjectId("65deb10745c350d729213802"),ObjectId("65deb10745c350d729213803"),ObjectId("65deb10745c350d729213804")]}])

在这里插入图片描述

4. Sort和投影

db.score.insert([{name:"xiaoming",score:78},{name:"xiaozhang",score:89},{name:"xiaoshuai",score:67},{name:"xiaohua",score:13},{name:"xiaoliu",scoer:99}
])

find();函数查询数据的时候默认按照_id去排序,本质上就是按照时间排序

在这里插入图片描述

MongoDB中sort函数可以指定文档排序的功能。

#按照score升序排序
db.score.find().sort({score:1});
#按照score降序排序
db.score.find().sort({score:-1});
#先按照socer1先降序排序,再按照score升序排序
db.score.find().sort({score1:-1,score:1});

在这里插入图片描述
如果我们在查询文档的时候只想看到我们想看到的字段,这时候就可以使用投影技术。

#只看name不看_id字段
db.score.find({},{name:1,_id:0}).sort({score:1});

在这里插入图片描述

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

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

相关文章

【力扣 - 杨辉三角】

题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]] 提示: 1 < numRows < 30 方法一&#xff1a;数学 思路…

2024年2月19日-2月25日周报

文章目录 1. 本周计划2. 完成情况2.1 DCGANS网络架构2.2 SRGAN网络架构 3. 总结及收获4.下周计划 1. 本周计划 学习网络架构DCGANS和SRGAN 2. 完成情况 2.1 DCGANS网络架构 模型的核心&#xff1a;&#xff08;论文链接&#xff09; 取消池化层&#xff0c;使用带步长(str…

Leetcode—82. 删除排序链表中的重复元素 II【中等】

2024每日刷题&#xff08;117&#xff09; Leetcode—82. 删除排序链表中的重复元素 II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val…

计算机设计大赛 深度学习手势识别 - yolo python opencv cnn 机器视觉

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

fork创建子进程及僵尸进程的产生及规避

本篇文章的学习与总结来源于 https://www.bilibili.com/cheese/play/ep182659?csourcecommon_hp_history_null&t3&spm_id_from333.1007.top_right_bar_window_history.content.click 通常使用fork()函数产生新的子进程&#xff0c;需要包含两个头文件<sys/types.h…

修改Qt生成iOS应用的原生底层,编译QtBase下的ios子模块

1.下载Qt源码 2.找到ios.pro子工程 3.使用QtCreaor12打开ios.pro工程 4.出现工程下只有一个.pro文件解决 复制修改好的toolchain.prf文件进行替换. 修改方法:

微服务之qiankun主项目+子项目搭建

主项目使用history&#xff0c;子项目使用hash模式 1. 下载安装"qiankun": "^2.10.13"2. 手动调用qiankun,使用vue脚手架搭建的项目1. 主项目配置&#xff08;我使用的是手动调用乾坤&#xff0c;在指定页面显示内容&#xff09;1. 要使用的页面中引入乾坤…

vue3项目如何配置能显示局域网之内的ip网址

在Vue 3项目中&#xff0c;如果你想要配置项目使其可以通过局域网内的IP地址被访问&#xff0c;通常需要修改开发服务器的配置&#xff0c;使其监听所有网络接口。下面是如何进行配置的步骤&#xff1a; 修改vue.config.js文件: 首先&#xff0c;确保你的项目根目录下有一个vue…

【LeetCode】每日一题:使二叉树所有路径值相等的最小代价

该题采用自底向上的思路的话&#xff0c;很容易想到使用贪心的思想&#xff0c;但是如何进行具体操作却有些难度。 这里补充一个重要的结论&#xff1a;二叉树的数组形式中&#xff0c;第i个节点的父节点是i/2&#xff1b;接下来只需要让自底向上让每个路径上的代价保持最低限…

互联网加竞赛 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

Ubuntu20.04 (VMware 虚拟机) fdisk -l 权限不够的解决办法

磁盘容量扩展时候&#xff0c;输入fdisk -l命令时&#xff0c;提示无权限&#xff0c; 这个时候考验耐心的时候到了&#xff01; 第一步&#xff1a; 输入su root 第二部&#xff1a; 然后输入root管理员账户密码 如果不知道密码的话&#xff0c;看第三步 第三步&#xf…

后端程序员入门react笔记(六)- 讲透Promise与Fetch

js声明变量的三种方式 我们通常使用 var let 和const来声明js的变量&#xff0c;但是这三者有什么区别呢&#xff1f; var的变量可以是全局的或者函数作用域&#xff0c;而let和const只能是块级作用域var和let可以重新赋值&#xff0c;而const是不允许重新赋值的&#xff0c;…

Linux课程四课---Linux开发环境的使用(vim编辑器的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

常见漏洞的流量特征

1、SQL注入漏洞 查看url / Referer字段/User-Agent字段/cookie字段 出现一些特殊字符&#xff08;eg&#xff1a;单引号【‘】、双引号【“”】、括号【&#xff08;&#xff09;】、单引号括号【‘&#xff08;】、双引号括号【“&#xff08;】等一些常见的特殊的字符&#…

改进的yolo交通标志tt100k数据集目标检测(代码+原理+毕设可用)

YOLO TT100K: 基于YOLO训练的交通标志检测模型 在原始代码基础上&#xff1a; 修改数据加载类&#xff0c;支持CoCo格式&#xff08;使用cocoapi&#xff09;&#xff1b;修改数据增强&#xff1b;validation增加mAP计算&#xff1b;修改anchor&#xff1b; 注: 实验开启weig…

HUAWEI 华为交换机 配置基于VLAN的MAC地址学习限制接入用户数量 配置示例

组网需求 如 图 2-15 所示&#xff0c;用户网络 1 通过 LSW1 与 Switch 相连&#xff0c; Switch 的接口为 GE0/0/1 。用户网络2通过 LSW2 与 Switch 相连&#xff0c; Switch 的接口为 GE0/0/2 。 GE0/0/1 、 GE0/0/2 同属于 VLAN2。为控制接入用户数&#xff0c;对 VLAN2 进…

蓝桥杯 最多约数

242*2*2*3&#xff08;质因子&#xff09;&#xff0c;约数&#xff08;11&#xff09;*&#xff08;11&#xff09;*&#xff08;11&#xff09;*&#xff08;11&#xff09;8 #include <bits/stdc.h> using namespace std; int main(){int a[700]{393353, 901440, 1234…

【React 报错】—Remove untracked files, stash or commit any changes, and try again.

【React 报错】—Remove untracked files, stash or commit any changes, and try again. 在react项目中通过.less文件进行样式定义&#xff0c;先暴露webpack配置文件&#xff0c;执行命令&#xff1a;yarn eject 或 npm run eject&#xff0c;报错如下&#xff1a; 原因是因…

第七十天 APP攻防-微信小程序解包反编译数据抓包APK信息资源提取

第70天 APP攻防-微信小程序&解包反编译&数据抓包&APK信息资源提取 知识点&#xff1a; 0、APK信息资源提取 1、微信小程序致据抓包 2、做信小程序解包反编译 1、信息收集应用8资产提取&权限等 2、漏润发现-反编泽&脱壳&代码审计 3、安全评估组件8散密…

李沐动手学习深度学习——3.2练习

以下是个人理解&#xff0c;希望进行讨论求解。 练习 1. 如果我们将权重初始化为零&#xff0c;会发生什么。算法仍然有效吗&#xff1f; 根据SGD算法公式如上&#xff0c;第一次迭代的值可知w只与b相关&#xff0c;而对于b的迭代更新&#xff0c;只是与b的初始值相关&#x…