MongoDB深度学习

news2024/12/23 10:54:51

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-mongodb
  data:
    mongodb:
      host: 192.168.150.101 #mongoDB的Ip
      port: 27017 #对应的端口
      database: sl #选中的数据库
      authentication-database: admin #认证数据库
      username: sl
      password: "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 {

    @Resource
    private MongoTemplate mongoTemplate;

    @Override
    public void savePerson(Person person) {
        mongoTemplate.save(person);
    }

    @Override
    public 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);
    }

    @Override
    public List<Person> queryPersonListByName(String name) {
        Query query = Query.query(Criteria.where("age").is(18));
        return mongoTemplate.find(query, Person.class);
    }

    @Override
    public 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);
    }

    @Override
    public 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 {

    @Resource
    PersonService personService;

    @Test
    void 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);
    }

    @Test
    void 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);
    }

    @Test
    void queryPersonListByName() {
        List<Person> personList = this.personService.queryPersonListByName("张三");
        personList.forEach(System.out::println);
    }

    @Test
    void queryPersonPageList() {
        List<Person> personList = this.personService.queryPersonPageList(1, 10);
        personList.forEach(System.out::println);
    }

    @Test
    void deleteById() {
        this.personService.deleteById("632283c08139e535c2bd7579");
    }

最终完成对SDM的使用。

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

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

相关文章

解码eBPF可观测性:eBPF如何改变我们所知的观测性

让我们来看看eBPF——这项技术到底是什么&#xff0c;它如何影响观测性&#xff0c;它与现有的观测性实践有什么区别&#xff0c;未来可能会发生什么变化&#xff1f; 在过去的两年里&#xff0c;云原生社区一直在热烈讨论eBPF。eBPF曾是KubeCon、eBPF Days和eBPF Summit的主题…

SystemVerilog Assertions应用指南 Chapter 1.17使用参数的SVA检验器

1.17使用参数的SVA检验器 SVA允许像 Verilog那样在检验器中使用参数( parameter)&#xff0c;这为创建可重用的属性提供了很大的灵活性。比如,两个信号间的延迟信息可以在检验器中用参数表示,那么这种检验器就可以在设计只有时序关系不同的情况中重用。例子1.2显示了个带延迟默…

【C++】一些C++11特性

C特性 1. 列表初始化1.1 {}初始化1.2 initializer_list 2. 声明2.1 auto2.2 typeid2.3 decltype2.4 nullptr 3. STL3.1 新容器3.2 新接口 4. 右值引用5. 移动构造与移动赋值6. lambda表达式7. 可变参数模板8. 包装器9. bind 1. 列表初始化 1.1 {}初始化 C11支持所有内置类型和…

Spring中自定义类型转换器

目录 一、什么是类型转换器 二、自定义类型转化器 2.1 实现Converter接口 2.2 在Spring中注册 三、自定义类型转换器中的细节 3.1 解决代码的耦合 3.2 注册标签id值必须唯一 ​3.3 Spring提供的日期转换器 一、什么是类型转换器 在Spring中类型转换器就是将配置文件中的字符串…

力扣一.链表的运用

一.合并生序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 输入:l1 = [], l2 = [] 输出:[] 输入:l1 = [], l2 = [0] 输出:[0]提示: 两个链表的…

【【萌新的FPGA学习之管脚设定xdc文件】】

萌新的FPGA学习之管脚设定xdc文件 xdc文件可以自己设置 也可以匹配 我们根据正点原子的流水灯管脚设定 主要讲述一下 各个英文设计是什么意思 Name&#xff1a;工程中顶层端口的名称。 Direction&#xff1a;说明管脚是输入还是输出。 Neg Diff Pair&#xff1a;负差分对&…

YOLOv5/v7/v8改进实验(三)之训练技巧篇

&#x1f680;&#x1f680; 前言 &#x1f680;&#x1f680; YOLO系列是一种目标检测算法&#xff0c;具有高效的实时性能和较高的准确性。一些常用的YOLO训练技巧往往可以帮助提高模型的性能和收敛速度。而这些技巧在YOLOv5、YOLOv7和YOLOv8几乎通用。 &#x1f525;&#…

CUDA编程入门系列(十一)CUDA程序优化技巧

优化原则&#xff1a;最大化并行执行 探索并行化&#xff1a; 优化线程块的规模 我们在设计CUDA程序的时候&#xff0c;要对线程块的个数进行考虑。因为GPU中流处理器SM的数量是相对固定的&#xff0c;所以我们应该尽量的将多个block放到同一个SM当中&#xff08;至少保证每个…

三、信号与槽

1. 信号槽的定义 信号函数和槽函数是Qt在C的基础上新增的功能&#xff0c;功能是实现对象之间的通信。 实现信号槽需要有两个先决条件&#xff1a; 通信的对象必须是从QObject派生出来的 QObject是Qt所有类的基类。 类中要有Q_OBJECT宏 2. 信号槽的使用 2.1 函数原型 最常…

免费SSL证书:JoySSL让您的网站更安全

在今天的数字化时代&#xff0c;保护网站和用户信息的安全至关重要。SSL&#xff08;Secure Sockets Layer&#xff09;证书通过加密网站与用户之间的通信&#xff0c;确保数据传输的安全性。让您拥有一个SSL加密的网站是至关重要的&#xff0c;但您可能会担心高昂的费用。不过…

秦丝科技“羽”深大计软学院同行,共庆深圳大学成立40周年

2023年10月21日&#xff0c; 由深圳大学工会主办 &#xff0c; 深圳大学体育学院 、深圳大学后勤部、丽湖校区管委会等单位协办的深圳大学2023年教职工羽毛球联赛-第一场正式举办&#xff1b; 由深圳市秦丝科技有限公司联合头部商户共同赞助的计算机与软件学院取得首场胜利&…

花生好车基于 KubeSphere 的微服务架构实践

公司简介 花生好车成立于 2015 年 6 月&#xff0c;致力于打造下沉市场汽车出行解决方案第一品牌。通过自建直营渠道&#xff0c;瞄准下沉市场&#xff0c;现形成以直租、批售、回租、新能源汽车零售&#xff0c;四大业务为核心驱动力的汽车新零售平台&#xff0c;目前拥有门店…

java基础--transient关键字减少序列化

前置内容 1.序列化 今天在看ArrayList源码的时候看到了这个&#xff0c;我之前应该是看过的&#xff0c;但是忘记了。现在在总结一下。 transient 用在类的属性上&#xff0c;不能修饰其他的。 作用&#xff1a;在序列化的时候transient修饰的属性不能被序列化 用途 在一些…

力扣:盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 …

【公众号开发】图像文字识别 · 模板消息推送 · 素材管理 · 带参数二维码的生成与事件的处理

【公众号开发】&#xff08;4&#xff09; 文章目录 【公众号开发】&#xff08;4&#xff09;1. 图像文字识别功能1.1 百度AI图像文字识别接口申请1.2 查看文档学习如何调用百度AI1.3 程序开发1.3.1 导入依赖&#xff1a;1.3.2 公众号发来post请求格式1.3.3 对image类型的消息…

【JavaEE】synchronized原理 -- 多线程篇(6)

synchronized原理 1. synchronized具体采用了哪些加锁策略?2. synchronized内部实现策略(内部原理)2.1 偏向锁2.2 轻量级锁与重量级锁 3. synchronized 的其它优化策略3.1 锁消除3.2 锁的粒度 4. 总结 1. synchronized具体采用了哪些加锁策略? synchronized既是悲观锁, 也是…

Power BI 傻瓜入门 4. Power BI:亮点

本章内容包含&#xff1a; 在Power BI Desktop上学习诀窍摄入数据使用模型试用Power BI服务 就像评估一个由多种成分组成的蛋糕一样&#xff0c;Power BI要求其用户熟悉商业智能&#xff08;BI&#xff09;解决方案中的功能。几乎所有与Power BI交互的用户都是从桌面版开始的…

Locust负载测试工具实操

本中介绍如何使用Locust为开发的服务/网站执行负载测试。 Locust 是一个开源负载测试工具&#xff0c;可以通过 Python 代码构造来定义用户行为&#xff0c;避免混乱的 UI 和臃肿的 XML 配置。 步骤 设置Locust。 在简单的 HTTP 服务上模拟基本负载测试。 准备条件 Python…

2021年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 下列代码的输出结果是&#xff1f;&#xff08; &#xff09; x 0x10print(x)A&#xff1a;2 B&#xff1a;8 C&#xff…