MongoDB 使用总结

news2024/12/22 19:30:49

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、 MongoDB简介
  • 二 、MongoDB特点
    • 2.1 数据特点
    • 2.2 数据存储
    • 2.3 扩展性
    • 2.4 MongoDB与Mysql对比
  • 三、命令简单介绍
    • 3.1 数据库以及表的操作
    • 3.2 新增数据
    • 3.3 更新数据
    • 3.4 删除数据
    • 3.5 查询数据
    • 3.6 索引
  • 四、MongoDB常用注解
  • 五、Spring Boot整合MongoDB
    • 5.1 引入依赖
    • 5.2 yml配置
    • 5.3 实体类
    • 5.4 新增数据
    • 5.5 条件查询
    • 5.6 分页查询
    • 5.7 更新数据
    • 5.8 删除数据
    • 5.9 地理位置搜索
      • 实体类
      • 第一种(不推荐)
      • 第二种(推荐)

圣达菲

一、 MongoDB简介

MongoDB官网 : https://www.mongodb.com

  • MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  • MongodDB是一个开源,高性能,支持海量数据存储的文档型数据库,是NoSQL数据库产品的一种
  • MongodDB是一个高效的非关系性数据库(不支持表关系,只能操作单表)

二 、MongoDB特点

2.1 数据特点

  1. 支持数据的海量存储
  2. 数据的读写响应速度较高
  3. 数据安全性不高,可以接受一定范围内的误差
  4. 不支持事务
  5. 动态字段
  6. MongodDB 使用Bson存储数据(Binary JSON),一种类似Json的数据格式

2.2 数据存储

在这里插入图片描述

2.3 扩展性

支持数据分片

2.4 MongoDB与Mysql对比

在这里插入图片描述

三、命令简单介绍

不常用

3.1 数据库以及表的操作

#查看所有的数据库
> show dbs

#创建数据库
#说明:在MongoDB中,数据库是自动创建的,通过use切换到新数据库中,进行插入数据即可自动创建数据库
#通过use关键字切换数据库
> use test

> show dbs #并没有创建数据库

> db.user.insert({id:1,name:'zhangsan'})  #插入数据

> show dbs

#查看表
> show tables

> show collections

#删除集合(表)
> db.user.drop()
true  #如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。

#删除数据库
> use test #先切换到要删除的数据中

> db.dropDatabase()  #删除数据库

3.2 新增数据

#插入数据
> db.user.insert({id:1,username:'zhangsan',age:20})
> 
> db.user.find()  #查询数据

3.3 更新数据

#查询全部
> db.user.find()

#更新数据
> db.user.update({id:1},{$set:{age:22}}) 

#注意:如果这样写,会删除掉其他的字段
> db.user.update({id:1},{age:25})

#更新不存在的字段,会新增字段
> db.user.update({id:2},{$set:{sex:1}}) #更新数据

#更新不存在的数据,默认不会新增数据
> db.user.update({id:3},{$set:{sex:1}})

#如果设置第一个参数为true,就是新增数据
> db.user.update({id:3},{$set:{sex:1}},true)

3.4 删除数据

#删除数据
> db.user.remove({})

#插入4条测试数据
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})

> db.user.remove({age:22},true)

#删除所有数据
> db.user.remove({})

3.5 查询数据

#插入测试数据
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})

db.user.find()  #查询全部数据
db.user.find({},{id:1,username:1})  #只查询id与username字段
db.user.find().count()  #查询数据条数
db.user.find({id:1}) #查询id为1的数据
db.user.find({age:{$lte:21}}) #查询小于等于21的数据
db.user.find({$or:[{id:1},{id:2}]}) #查询id=1 or id=2

#分页查询:Skip()跳过几条,limit()查询条数
db.user.find().limit(2).skip(1)  #跳过1条数据,查询2条数据
db.user.find().sort({id:-1}) #按照id倒序排序,-1为倒序,1为正序

3.6 索引

1:升序索引 2:降序索引

#查看索引
db.user.getIndex()

#创建索引
db.user.createIndex({'age':1})

四、MongoDB常用注解

注解描述
@Document把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档,标注在实体类上,类似于hibernate的entity注解。
@Id文档的唯一标识,在mongodb中为ObjectId,它是唯一的,不可重复,自带索引,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。
@Transient映射忽略的字段,该字段不会保存到mongodb,只作为普通的javaBean属性。
@Field 映射 mongodb中的字段名,可以不加,不加的话默认以参数名为列名。
@Indexed声明该字段需要索引,建索引可以大大的提高查询效率。
@CompoundIndex复合索引的声明,建复合索引可以有效地提高多字段的查询效率。
@GeoSpatialIndexed声明该字段为地理信息的索引。
@DBRef关联另一个document对象。类似于mysql的表关联,但并不一样,mongo不会做级联的操作。

五、Spring Boot整合MongoDB

5.1 引入依赖

<!--SpringDataMongo起步依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

5.2 yml配置

spring:
  data:
    mongodb:
      uri: mongodb://127.0.0.1:27017/tanhua

5.3 实体类

MongoDB 推荐id 为:ObjectId 类型

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(value="person")
public class Person {

    @Id
    private ObjectId id; 
    
    @Field("username")
    private String name;
    
    private int age;
    
    private String address;
}

5.4 新增数据

@SpringBootTest
public class MongoPersonTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void testSave() {
        Person person = new Person();
        person.setName("李四");
        person.setAge(18);
        person.setAddress("杭州");
        mongoTemplate.save(person);
    }
}

新增成功
在这里插入图片描述

5.5 条件查询

这是目前表中数据用于查询 在这里插入图片描述

    /**
     * 条件查询
     */
    @Test
    public void testFind() {
        //查询年龄小于20的所有人
        Query query = new Query(Criteria.where("age").lt(20)); //查询条件对象
        //查询
        List<Person> list = mongoTemplate.find(query, Person.class);

        for (Person person : list) {
            System.out.println(person);
        }
    }

查询成功
在这里插入图片描述

5.6 分页查询

/**
     * 分页查询
     */
    @Test
    public void testPage() {
        Criteria criteria = Criteria.where("age").lt(30);
        //1 查询总数
        Query queryCount = new Query(criteria);
        long count = mongoTemplate.count(queryCount, Person.class);
        System.out.println(count);
        //2 查询第二页,每页查询2条
        Query queryLimit = new Query(criteria)
                .skip(2)  //开启查询的条数 (page-1)*size
                .limit(5)//设置每页查询条数
                .with(Sort.by(Sort.Order.desc("age")));//排序
        List<Person> list = mongoTemplate.find(queryLimit, Person.class);
        for (Person person : list) {
            System.out.println(person);
        }
    }

查询成功
在这里插入图片描述

5.7 更新数据

    /**
     * 更新:
     *    根据id,更新年龄 地址
     */
    @Test
    public void testUpdate() {
        //1 条件  id对应age为18的数据
        Query query = Query.query(Criteria.where("id").is("64ca7274b8287f3990363504"));
        //2 更新的数据
        Update update = new Update();
        update.set("age", 20);
        update.set("address", "上海");
        mongoTemplate.updateFirst(query, update, Person.class);
    }

更新成功
在这里插入图片描述

5.8 删除数据

   /**
     * 删除
     */
    @Test
    public void testRemove() {
        Query query = Query.query(Criteria.where("id").is("64ca7274b8287f3990363504"));
        mongoTemplate.remove(query, Person.class);
    }

已删除上面更新的数据
在这里插入图片描述

5.9 地理位置搜索

使用MongoDB进行地理位置搜索,选择索引类型为:2dsphere (支持地球表面上进行几何计算)

存储地址数据使用GeoJsonPoint

搜索原理:已以某个位置为圆点,然后以搜索的距离为半径画圆。

注意事项:

  1. 需要给对应字段建立索引类型为:2dsphere
  2. 配置对应的实体类及相应注解
  3. GeoJsonPoint对像不支持序列化,如果项目使用Dubbo进行远程调用(使用RPC通信,采用二进制,需要对对象进行序列化处理)那么GeoJsonPoint对象无法传递,需要通过经纬度传递后在整合。

实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "user_location")
@CompoundIndex(name = "location_index", def = "{'location': '2dsphere'}")
public class UserLocation implements Serializable {

    private static final long serialVersionUID = 45088645678765429970L;

    @Id
    private ObjectId id;
    @Indexed
    private Long userId; //用户id
    private GeoJsonPoint location; //x:经度 y:纬度
    private String address; //位置描述
    private Long created; //创建时间
    private Long updated; //更新时间
}

第一种(不推荐)

无法获取圆心到目标的距离

    @Override
    public void testQueryNear(Long userId, Double metre) {
        //1. 根据用户id,查询用户的位置信息
        Query query = Query.query(Criteria.where("userId").is(userId));
        UserLocation location = mongoTemplate.findOne(query, UserLocation.class);
        if (location == null) {
            return null;
        }
        //2. 已当前用户位置绘制原点
        GeoJsonPoint point = location.getLocation();
//        GeoJsonPoint point = new GeoJsonPoint(110.123, 47.982);
        //3. 绘制半径
        Distance distance = new Distance(metre / 1000, Metrics.KILOMETERS);
        //4. 绘制圆形
        Circle circle = new Circle(point, distance);
        //5. 查询
        Query locationQuery = Query.query(Criteria.where("location").withinSphere(circle));
        List<UserLocation> list = mongoTemplate.find(locationQuery, UserLocation.class);
        for (UserLocation userLocation : list) {
            System.out.println(userLocation);
        }
    }

第二种(推荐)

public void testQueryNear(Double metre) {
      //构建圆点
        GeoJsonPoint point = new GeoJsonPoint(10.123, 47.982);
        //创建NearQuery对象
        NearQuery nearQuery = NearQuery.near(point, Metrics.KILOMETERS).maxDistance(metre / 1000, Metrics.KILOMETERS);
        //查询
        GeoResults<UserLocation> results = mongoTemplate.geoNear(nearQuery, UserLocation.class);
        for (GeoResult<UserLocation> result : results) {
            System.out.println(result.getContent());
            System.out.println(result.getDistance().getValue());
        }

    }

在这里插入图片描述在这里插入图片描述

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

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

相关文章

MyCat配置文件schema.xml讲解

1.MyCat配置 1.1 schema标签 如果checkSQLschema配置的为false&#xff0c;那么执行DB01.TB_ORDER时就会报错&#xff0c;必须用use切换逻辑库以后才能进行查询。 sqlMaxLimit如果未指定limit进行查询&#xff0c;列表查询模式默认为100,最多只查询100条。因为用mycat后默认数…

【多线程】synchronized 原理

1. 写在前面 本章节主要介绍 synchronized 的一些内部优化机制&#xff0c;这些机制存在的目的呢就是让 synchronized 这把锁更高效更好用&#xff01; 2. 锁升级/锁膨胀 JVM 将 synchronized 锁分为以下四种状态&#xff1a; 无锁&#xff0c;偏向锁&#xff0c;轻量级锁&…

ENSP软件的基本使用命令(第三十一课)

ENSP软件的基本使用命令(第三十一课) 下面的图片是今天操作的核心基础操作 1 命令行页面 交换机 路由器 PC机 分别展示一下 页面的样子 2 基本命令结构

K8S系列文章 之 容器存储基础 Volume

Volume Volume是容器数据卷。我们经常创建删除一些容器&#xff0c;但有时候需要保留容器中的一些数据&#xff0c;这时候就用到了Volume。它也是容器之间数据共享的技术&#xff0c;可以将容器中产生的数据同步到本地。实际就是把容器中的目录挂载到运行着容器的服务器或个人…

Last-Mile Embodied Visual Navigation 论文阅读

论文阅读 题目&#xff1a;Last-Mile Embodied Visual Navigation 作者&#xff1a;JustinWasserman, Karmesh Yadav 来源&#xff1a;CoRL 时间&#xff1a;2023 代码地址&#xff1a;https://jbwasse2.github.io/portfolio/SLING Abstract 现实的长期任务&#xff08;例如…

Spring Cloud Gateway过滤器GlobalFilter详解

一、过滤器的场景 在springCloud架构中&#xff0c;网关是必不可少的组件&#xff0c;它用于服务路由的转发。对客户端进行屏蔽微服务的具体细节&#xff0c;客户端只需要和网关进行交互。所以网关顾名思义&#xff0c;就是网络的一个关卡。它就是一座城的城门守卫。所以这个守…

10亿数据、查询<10s,论基于OLAP搭建广告系统的正确姿势

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 由于流量红利逐渐消退&#xff0c;越来越多的广告企业和从业者开始探索精细化营销的新路径&#xff0c;取代以往的全流量、粗放式的广告轰炸。精细化营销意味着要在…

抓包神器-burp

Burp Suite是一款信息安全从业人员必备的集成型的渗透测试工具&#xff0c;它采用自动测试和半自动测试的方式&#xff0c;包含了 Proxy,Spider,Scanner,Intruder,Repeater,Sequencer,Decoder,Comparer等工具模块。通过拦截HTTP/HTTPS的web数据包&#xff0c;充当浏览器和相关应…

机器学习常用Python库安装

机器学习常用Python库安装 作者日期版本说明Dog Tao2022.06.16V1.0开始建立文档 文章目录 机器学习常用Python库安装Anaconda简介使用镜像源配置 Pip简介镜像源配置 CUDAPytorch安装旧版本 TensorFlowGPU支持说明 DGL简介安装DGLLife RDKitscikit-multilearn Anaconda 简介 …

RocketMQ使用

说明&#xff1a;本文介绍RocketMQ的消费模式&消息类型&#xff0c;RocketMQ的安装参考及简单使用&#xff0c;参考&#xff1a;http://t.csdn.cn/BKFPj 消费模式 RocketMQ与RabbitMQ最大的区别在于&#xff0c;RocketMQ是根据消息的Topic锁定消费者的&#xff0c;Topic属…

当不在公司时,如何在外远程登录公司内网OA系统?

在外远程登录公司内网OA系统 文章目录 在外远程登录公司内网OA系统前言1. 打开“远程桌面”选项2. 安装cpolar客户端3. 登录cpolar客户端4. 创建隧道5. 生成公网地址6. 远程连接其他电脑 前言 随着信息化办公的快速推进&#xff0c;很多企业已经用上了OA系统&#xff0c;并且我…

ubuntu上安装mosquitto服务

1、mosquitto是什么 Mosquitto 项目最初由 IBM 和 Eurotech 于 2013 年开发&#xff0c;后来于 2016 年捐赠给 Eclipse 基金会。Eclipse Mosquitto 基于 Eclipse 公共许可证(EPL/EDL license)发布&#xff0c;用户可以免费使用。作为全球使用最广的 MQTT 协议实现之一 &#x…

Diffusion扩散模型学习4——Stable Diffusion原理解析-inpaint修复图片为例

Diffusion扩散模型学习4——Stable Diffusion原理解析-inpaint修复图片为例 学习前言源码下载地址原理解析一、先验知识二、什么是inpaint三、Stable Diffusion中的inpaint1、开源的inpaint模型2、基于base模型inpaint 四、inpaint流程1、输入图片到隐空间的编码2、文本编码3、…

东芝低导通电阻N沟道MOSFET 为智能穿戴设备赋能

东芝低导通电阻N沟道MOSFET TPN6R303NC,LQ(S 为智能穿戴设备赋能 MOSFET也就是金属-氧化物半导体场效应晶体管&#xff0c;外形与普通晶体管差不多&#xff0c;但具有不同的控制特性&#xff0c;主要是通过充电和放电来切换或放大信号。 此次推出的用于智能穿戴的30V N沟道MO…

CMake的使用--以ORCA避碰C++库为例

1、安装cmake 链接&#xff1a;Download | CMake 版本需下载Binary distributions这个模块下的 Windows x64 Installer: cmake-3.27.1-windows-x86_64.msi 注意事项 1.1勾选为所有用户添加到PATH路径 Add CMake to the system PATH for all users 1.2安装路径建议直接在c…

Dueling Network

Dueling Network —— Dueling Network Architectures for Deep Reinforcement Learning 论文下载地址 论文介绍 图9. Dueling Network 模型结果示意图 Dueling Network与传统DQN的区别在于神经网络结构的不同&#xff0c;Dueling Netowrk在传统DQN的基础上只进行了微小的改动…

python 合并多个excel文件

使用 openpyxl 思路&#xff1a; 读取n个excel的文件&#xff0c;存储在一个二维数组中&#xff0c;注意需要转置。将二维数组的数据写入excel。 安装软件&#xff1a; pip install openpyxl源代码&#xff1a; import os import openpyxl # 将n个excel文件数据合并到一个…

jupyter lab环境配置

1.jupyterlab 使用虚拟环境 conda install ipykernelpython -m ipykernel install --user --name tf --display-name "tf" #例&#xff1a;环境名称tf2. jupyter lab kernel管理 show kernel list jupyter kernelspec listremove kernel jupyter kernelspec re…

微软研究院展示Project Rumi项目;参数高效微调(PEFT)

&#x1f989; AI新闻 &#x1f680; 微软研究院展示Project Rumi项目&#xff0c;通过多模态方法增强人工智能理解能力 摘要&#xff1a;微软研究院展示了Project Rumi项目&#xff0c;该项目通过结合文本、音频和视频数据&#xff0c;并采用多模态副语言提示的方法&#xf…

VL 模型 Open-Set Domain Adaptation with Visual-Language Foundation Models 论文阅读笔记

Open-Set Domain Adaptation with Visual-Language Foundation Models 论文阅读笔记 一、Abstract 写在前面 又是一周周末&#xff0c;在家的时间感觉过得很快呀。今天没得时间写博客&#xff0c;留下个标题&#xff0c;明天搞完。 论文地址&#xff1a;Open-Set Domain Adapta…