MongoDB深度学习

MongoDB的简介

什么是MongoDB?

  • MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。
  • MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
  • MongoDB的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现了类似关系数据库单表查询的绝大部分功能(可以通过聚合的方式实现多表查询),而且还支持对数据建立索引。

MongoDB使用场景的特点

1.数据量大。

2.写入操作频繁。(读写都很频繁)

3.价值较低的数据,对事务性要求不高。

安装MongoDB

1.拉取镜像

docker pull mongo:4.4

2.创建挂载的目录

mkdir /data/db

3.运行镜像开启容器。(记得打开端口)

docker run -d \
--name mongodb \
-p 27017:27017 \
--restart=always \
-v mongodb:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=sl \
-e MONGO_INITDB_ROOT_PASSWORD=123321 \
mongo:4.4

进入容器的mongodb控制台

docker exec -it mongodb mongo admin --authenticationDatabase "admin"

效果为下:

MongoDB的使用

和mysql进行对比

MongoDB的基础操作

基本操作 

#查询出使用的数据库
show dbs #选中对应的数据库
use 数据库 #插入数据(插入一个对象)
db.user.insert({id:1,name:'zhangsan'})#查出数据库中所有表的信息
show tables
show collections#删除表
db.user.drop()#删除数据库(要先使用use选中该表)
db.dropDatabase()

新增操作

#使用 insert操作完成插入操作
db.test.insert({id: 01, name: "好废物", age: 19})#使用 save操作完成插入(test表示表的名字)
db.test.insert({id: 01, name:"tolen", age:19})#查询对应表中的数据(test表示表的名字)
db.test.find()
  • _id 是集合中文档的主键,用于区分文档(记录),_id自动编入索引。(主键)
  • 默认情况下,_id 字段的类型为 ObjectID,是 MongoDB 的 BSON 类型之一,如果需要,用户还可以将 _id 覆盖为 ObjectID 以外的其他内容。
  • ObjectID 长度为 12 字节,由几个 2-4 字节的链组成。每个链代表并指定文档身份的具体内容。以下的值构成了完整的 12 字节组合:
    • 一个 4 字节的值,表示自 Unix 纪元以来的秒数
    • 一个 3 字节的机器标识符
    • 一个 2 字节的进程 ID
    • 一个 3字节的计数器,以随机值开始

更新操作
更新对应的格式为下:

db.collection.update(<query>,<update>,[upsert: <boolean>,multi: <boolean>,writeConcern: <document>]
)

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如inc...)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。
#选中对应的数据库(test表示表的名字)
#第一个为参数为条件, 
db.test.update({id:1}, {$set:{age:22}})#第一个为参数, 第二个参数中没有$set,就是将其他数据删除其他数据就保留设置的新值
db.test.update({id:1}, {age:25})#update更新的字段如果不存在则就会自动创建字段
#更新不存在的数据,默认不会新增数据
db.test.update({id:5},{$set:{name:22}})#设置第一个参数为true就表示该update为新增
db.test.update({id:5},{$set:{name:22}}, true)

删除操作

删除对应格式为下:

db.collection.remove(<query>,{justOne: <boolean>,writeConcern: <document>}
)

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
  • writeConcern :(可选)抛出异常的级别。
#通过条件删除对应的数据
db.test.remove({age:22})#设置的第二个参数为boolean类型,如果为true表示只删除一条,为false则为全部删除db.test.remove({age:22}, true)#删除所有的数据
db.test.remove({})

查询操作

MongoDB 查询数据的语法格式为:db.user.find([query],[fields])

  • query :可选,使用查询操作符指定查询条件
  • fields :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

 格式为下:

#通过条件查询对应的数据
db.test.find({id:1,username:1})
#查询符合条件的数据的个数
db.test.find({id:1}).count()
#age小于等于对应的值
db.test.find({age:{$lte:21}})
#age大于等于对应的值
db.test.find(age:{$gte:23})
#通过或进行判断
db.test.find({$or:[{id:1},{id:2}]})#分页查询 Skip()跳过几条数据 limit限制查询条数
db.test.find().limit(2).skip(1)#排序查找,通过id进行倒叙
db.test.find().sort({id:-1})

索引操作

MongoDB支持的索引。

  • 单字段索引(Single Field)
    • 支持所有数据类型中的单个字段索引
  • 复合索引(Compound Index)
    • 基于多个字段的索引,创建复合索引时要注意字段顺序与索引方向
  • 多键索引(Multikey indexes)
    • 针对属性包含数组数据的情况,MongoDB支持针对数组中每一个element创建索引。
  • 全文索引(Text Index)
    • 支持任意属性值为string或string数组元素的索引查询。
    • 注意:一个集合仅支持最多一个Text Index,中文分词不理想,推荐Elasticsearch。
  • 地理空间索引(Geospatial Index)
    • 2dsphere索引,用于存储和查找球面上的点
    • 2d索引,用于存储和查找平面上的点
  • 哈希索引(Hashed Index)
    • 针对属性的哈希值进行索引查询,当要使用Hashed index时,MongoDB能够自动的计算hash值,无需程序计算hash值。
    • hash index仅支持等于查询,不支持范围查询。

对应的格式为下:

#单字段索引,1表示升序创建索引,-1表示降序创建索引
db.test.createIndex({"字段": 1})#2dsphere索引
db.test.createIndex({"字段": "2dsphere"})#查询索引
db.test.getIndexes()#查看索引的大小
db.test.totalIndexSize()#删除对应的索引
db.test.dropIndex("索引对应的名字")
#删除所有的索引
db.test.dropIndexes()

spring Data MongoDB(SDM)使用

1.添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2.修改application.yml配置文件

spring:application:name: sl-express-mongodbdata:mongodb:host: 192.168.150.101 #mongoDB的Ipport: 27017 #对应的端口database: sl #选中的数据库authentication-database: admin #认证数据库username: slpassword: "123321"auto-index-creation: true #自动创建索引

3.创建Entity

PersonEntity

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexType;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexed;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document("sl_person") //指定表名
public class Person {@Id // 标识为主键private ObjectId id;@Indexed //标识索引字段private String name;private int age;/*** 用户位置* x: 经度,y:纬度*/@GeoSpatialIndexed(type = GeoSpatialIndexType.GEO_2DSPHERE)private GeoJsonPoint location;//存储嵌套对象数据private Address address;
}

addressEntity

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document("sl_address") //指定表名
public class Address {private String street;private String city;private String zip;
}

@Document注解表示该Entity对应在mongoDB中的表(表只是个比喻,就是document对标mysql中的表) 

@Id注解表示在表中对应的Id字段(表只是个比喻,就是document对标mysql中的表)

@Indexed表示在表中的索引。

service类和实现类

service

import com.sl.mongo.entity.Person;import java.util.List;public interface PersonService {/*** 新增数据** @param person 数据*/void savePerson(Person person);/*** 更新数据** @param person 数据*/void update(Person person);/*** 根据名字查询用户列表** @param name 用户名字* @return 用户列表*/List<Person> queryPersonListByName(String name);/*** 分页查询用户列表** @param page     页数* @param pageSize 页面大小* @return 用户列表*/List<Person> queryPersonPageList(int page, int pageSize);/*** 根据id删除用户** @param id 主键*/void deleteById(String id);
}

impl

import com.sl.mongo.entity.Person;
import com.sl.mongo.service.PersonService;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;@Service
public class PersonServiceImpl implements PersonService {@Resourceprivate MongoTemplate mongoTemplate;@Overridepublic void savePerson(Person person) {mongoTemplate.save(person);}@Overridepublic void update(Person person) {Query query = Query.query(Criteria.where("age").is(person.getAge()));Update update = Update.update("age", person.getAge()).set("name", person.getName()).set("location", person.getLocation()).set("address", person.getAddress());//更新数据mongoTemplate.updateFirst(query, update, Person.class);}@Overridepublic List<Person> queryPersonListByName(String name) {Query query = Query.query(Criteria.where("age").is(18));return mongoTemplate.find(query, Person.class);}@Overridepublic List<Person> queryPersonPageList(int page, int pageSize) {//在条件中可以通过and进行拼接条件, regex()方法就是模糊查询//方法一Query query = Query.query(Criteria.where("name").regex("三")).skip((page - 1) * pageSize).limit(pageSize);return mongoTemplate.find(query, Person.class);//方法二//索引从0开始//PageRequest pageRequest = PageRequest.of(page - 1, pageSize);//Query q = new Query().with(pageRequest);//return mongoTemplate.find(query, Person.class);}@Overridepublic void deleteById(String id) {mongoTemplate.remove(Query.query(Criteria.where("age").is(18)), Person.class);}
}

进行测试

import com.sl.mongo.entity.Address;
import com.sl.mongo.entity.Person;
import org.bson.types.ObjectId;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;import javax.annotation.Resource;import java.util.List;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest
class PersonServiceTest {@ResourcePersonService personService;@Testvoid savePerson() {Person person = Person.builder().id(ObjectId.get()).name("张三").age(20).location(new GeoJsonPoint(116.343847, 40.060539)).address(new Address("人民路", "上海市", "666666")).build();this.personService.savePerson(person);}@Testvoid update() {Person person = Person.builder().id(new ObjectId("632283c08139e535c2bd7579")).name("张三").age(22) //修改数据.location(new GeoJsonPoint(116.343847, 40.060539)).address(new Address("人民路", "上海市", "666666")).build();this.personService.update(person);}@Testvoid queryPersonListByName() {List<Person> personList = this.personService.queryPersonListByName("张三");personList.forEach(System.out::println);}@Testvoid queryPersonPageList() {List<Person> personList = this.personService.queryPersonPageList(1, 10);personList.forEach(System.out::println);}@Testvoid deleteById() {this.personService.deleteById("632283c08139e535c2bd7579");}

最终完成对SDM的使用。

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

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

相关文章

面试算法31:最近最少使用缓存

题目 请设计实现一个最近最少使用&#xff08;Least Recently Used&#xff0c;LRU&#xff09;缓存&#xff0c;要求如下两个操作的时间复杂度都是O&#xff08;1&#xff09;。 get&#xff08;key&#xff09;&#xff1a;如果缓存中存在键key&#xff0c;则返回它对应的值…

【二维差分】ICPC南京 A

https://codeforces.com/gym/104128/problem/A 题意 思路 二维差分经典模型 考虑如果没有洞那么经历操作之后会剩下什么样子的袋鼠。发现上下左右移动可以看成是边界在移动&#xff0c;边界一直保持一个原初的矩形形状&#xff0c;而且上下移动和左右移动没有任何关系。一旦…

【LeetCode刷题(数据结构与算法)】:将二叉搜索树转化为排序的双向链表

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 对于双向循环列表&#xff0c;你可以将左右孩子指针作为双向循环链表的前驱和后继指针&#xff0c;第一个节点的前驱是最后一个节点&#xff0c;最后一个节点的后继是第一个节点 特别地&#xff0c;我们希望可以 就地 完…

Elasticsearch 8.9 Master节点处理请求源码

大家看可以看ElasticSearch源码&#xff1a;Rest请求与Master节点处理流程&#xff08;1&#xff09; 这个图非常好&#xff0c;下午的讲解代码在各个类和方法之间流转&#xff0c;都体现这个图上 一、Master节点处理请求的逻辑1、节点(数据节点)要和主节点进行通讯&#xff0…

【数据结构】线性表(四)双向链表的各种操作(插入、删除、查找、修改、遍历打印)

目录 线性表的定义及其基本操作&#xff08;顺序表插入、删除、查找、修改&#xff09; 四、线性表的链接存储结构 1. 单链表 2. 循环链表 3. 双向链表 a. 双向链表节点结构 b. 创建一个新的节点 c. 在链表末尾插入节点 d. 在指定位置插入节点 e. 删除指定位置的节点…

Juniper防火墙SSG-140 session 过高问题

1.SSG-140性能参数 2.问题截图 3.解决方法 &#xff08;1&#xff09;通过telnet 或 consol的方法登录到防火墙&#xff1b; &#xff08;2&#xff09;使用get session 查看总的session会话数&#xff0c;如果大于300 一般属于不正常情况 &#xff08;3&#xff09;使用get…

H5随机短视频滑动版带打赏源码,可封装APP软件或嵌入式观看

H5随机短视频滑动版带打赏源码&#xff0c;可封装APP软件或嵌入式观看&#xff0c;网站引流必备源码&#xff01; 数据来源抖音和快手官方短视频链接&#xff0c;无任何违规内容&#xff01;可自行添加广告等等&#xff01; 手机端完美支持滑动屏幕观看&#xff08;向上或向右…

思维模型 上瘾模型(hook model)

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。你到底是怎么上瘾&#xff08;游戏/抖音&#xff09;的&#xff1f;我们该如何“积极的上瘾”&#xff1f;让我们来一切揭晓这背后的秘密。 1 上瘾模型的应用 1.1上瘾模型的积极应用 1 学…

RT-Thread学习笔记(三):线程管理

线程管理 线程管理相关概念什么是时间片轮转调度器锁线程运行机制线程的五种状态 动态和静态创建线程区别动态和静态创建线程优缺点RT-Thread动态线程管理函数动态创建线程动态删除线程 RT-Thread静态线程管理函数静态创建线程 线程其他操作线程启动线程延时获得当前执行的线程…

四、基本组件

1. Designer设计师 Designer程序是Qt官方推出的专为设计人员使用的UI设计工具&#xff0c;程序员可以使用此工具大幅降低UI设计的代码量。 Designer设计文件的格式是.ui&#xff0c;需要配合同名的头文件与源文件使用。.ui文件通常被称为界面文件&#xff0c;其内部是xml语法的…

微机原理:汇编语言语句类型与格式

文章目录 壹、语句类型1、语句分类2、常用伪代码和运算符2.1数据定义伪指令2.1.1字节定义伪指令DB&#xff08;8位&#xff09;2.1.2字定义伪指令DW&#xff08;16位&#xff09;2.1.3双字节伪指令DD2.1.4 多字节定义DF/DQ/DT&#xff08;了解&#xff09; 2.2 常用运算符2.2.1…

[java进阶]——异常详解,try catch捕获异常,抛出异常

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、异常的体系结构 二、处理异常的本质 三、异常处理的三种方式 3.1虚拟机jvm处理(默认) 3.2 try catch捕获异常 3.3抛出异常 3.4finally关键字 四、自定义异常 五、总结 一、异常的体系结构 分析&#…

【LeetCode】145. 二叉树的后序遍历 [ 左子树 右子树 根结点]

题目链接 文章目录 Python3方法一&#xff1a; 递归 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二&#xff1a; 迭代 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法三&#xff1a; Morris ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1) \rgroup ⟮O(n)、O(1)⟯写…

MySQL表操作—存储

建表&#xff1a; mysql> create table sch( -> id int primary key, -> name varchar(50) not null, -> glass varchar(50) not null -> ); Query OK, 0 rows affected (0.01 sec) 插入数据&#xff1a; mysql> insert into sch (id,name,…

c语言练习94:分割链表

分割链表 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x…

短视频矩阵系统源码(搭建)

短视频矩阵源码的开发路径分享如下&#xff1a; 1、首先&#xff0c;确定项目需求和功能&#xff0c;包括用户上传、编辑、播放等。 2、其次&#xff0c;搭建开发环境&#xff0c;选择合适的开发工具和框架。 3、然后&#xff0c;进行项目架构设计和数据库设计&#xff0c;确…

弹出框,使用树结构查询数据

效果如下: 描述:希望点击某个按钮,弹出一个窗口,然后通过下拉框,点击下拉框里面的组织信息,然后查询对应组织的成员对象列表,并展示到表格中 HTML代码(最主要的就是树的那个): <el-dialog :visible.sync="TesteePage.showDialog" width="70%&quo…

【CGSSA-BP预测】基于混合混沌-高斯变异-麻雀算法优化BP神经网络回归预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

用Wokwi仿真ESP-IDF项目

陈拓 2023/10/21-2023/10/21 1. 概述 Wokwi是一个在线的电子电路仿真器。你可以使用它来仿真Arduino、ESP32、STM32和许多其他流行的电路板、元器件以及传感器&#xff0c;免去使用开发板。 Wokwi提供基于浏览器的界面&#xff0c;您可以通过这种简单直观的方式快速开发一个…

自然语言处理---Transformer机制详解之Transformer优势

1 Transformer的并行计算 对于Transformer比传统序列模型RNN/LSTM具备优势的第一大原因就是强大的并行计算能力. 对于RNN来说&#xff0c;任意时刻t的输入是时刻t的输入x(t)和上一时刻的隐藏层输出h(t-1)&#xff0c;经过运算后得到当前时刻隐藏层的输出h(t)&#xff0c;这个…