MongoDB 使用总结

🍓 简介: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());
        }

    }

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无人驾驶实战-第五课(动态环境感知与3D检测算法)

激光雷达的分类&#xff1a; 机械式Lidar&#xff1a;TOF、N个独立激光单元、旋转产生360度视场 MEMS式Lidar&#xff1a;不旋转 激光雷达的输出是点云&#xff0c;点云数据特点&#xff1a; 简单&#xff1a;x y z i &#xff08;i为信号强度&#xff09; 稀疏&#xff1a;7%&…

【肺炎分类数据集】数据量非常充足的新冠肺炎分类数据共享

一、肺炎数据集介绍&#x1f349;&#xff1a; 1.1 格式&#x1f388; 按照标准的格式分为了①训练集train&#xff08;134138575198张&#xff09;&#xff0c;②验证集val&#xff08;8816张&#xff09;&#xff0c;③测试集test&#xff08;234390624张&#xff09;&#…

Windows server上用nginx部署vue3项目

Windows server上用nginx部署vue3项目 一、Node中node_modules文件夹及package.json文件的作用说明二、VUE3项目打包三、Windows Server上的Nginx部署 一、Node中node_modules文件夹及package.json文件的作用说明 node_modules是安装node后用来存放用包管理工具下载安装的包的…

【项目 计网3】Socket介绍 4.9字节序 4.10字节序转换函数

文章目录 4.8 Socket介绍4.9字节序简介字节序举例 4.10字节序转换函数 4.8 Socket介绍 所谓 socket&#xff08;套接字&#xff09;&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进…

VUE之JWT前后端分离认证,学生管理系统

参考资料: SpringBoot搭建教程 SpringCloud搭建教程 JWT视频教程 JWT官网 Vue视频教程 JWT视频参考资料、VUE视频资料,及前后端demo 特别有参考价值的JWT博客1 特别有参考价值的JWT博客2 cookie、localstorage和sessionStorage的区别1 cookie、localstorage和sessi…

总结七大排序!

排序总览 外部排序&#xff1a;依赖硬盘&#xff08;外部存储器&#xff09;进行的排序。对于数据集合的要求特别高&#xff0c;只能在特定场合下使用&#xff08;比如一个省的高考成绩排序&#xff09;。包括桶排序&#xff0c;基数排序&#xff0c;计数排序&#xff0c;都是o…

【数据库】将excel数据导入mysql数据库

环境&#xff1a;Windows10 mysql8以上 将你要导入的excel表另存为txt格式 打开txt格式文件&#xff0c;删除表头行并另存为并更改编码方式&#xff08;由于与数据库的编码不同&#xff0c;会导致导入报错&#xff09; 通过命令行登录数据库 winr cmd进入 进入装mysql的目录位…

软件设计原则

文章目录 一、软件设计原则1. 开闭原则2. 里氏代换原则3. 依赖倒转原则4. 接口隔离原则5. 迪米特法则6. 合成复用原则 一、软件设计原则 在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要尽量根据软件…

【ASP.NET MVC】使用动软(四)(12)

一、筛选器类和Cookie实现路由 需解决的问题&#xff1a; 网站登录往往需要用户名密码验证&#xff0c;为避免重复验证&#xff0c;一般采用Cookie 、Session等技术来保持用户的登录状态&#xff1a; Session是在服务端保存的一个数据结构&#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;例如…

antv/l7地图,鼠标滚动,页面正常滑动-- 我们忽略的deltaY

背景 在官网项目中&#xff0c;需要使用一个地图&#xff0c;展示产品的分布区域及数量。希望的交互是&#xff0c;鼠标放上标点&#xff0c;tooltip展示地点和数量等信息。鼠标滚动&#xff0c;则页面随着滚动。但是鼠标事件是被地图代理了的&#xff0c;鼠标滚动意味着地图的…

4,链表【p5】

链表 4.1哈希表简介4.2有序表简介4.3链表4.3.1例1-反转单向和双向链表4.3.2例2-打印两个有序链表的公共部分4.3.3面试时链表解题的方法论4.3.4例3-判断一个链表是否为回文结构4.3.4.1快慢指针 4.3.5例4-将单向链表按某值划分成左边小、中间相等、右边大的形式4.3.6例5-复制好友…

RabbitMQ - 简单案例

目录 0.引用 1.Hello world 2.轮训分发消息 2.1 抽取工具类 2.2 启动两个工作线程接受消息 2.4 结果展示 3.消息应答 3.1 自动应答 3.2 手动消息应答的方法 3.3 消息自动重新入队 3.4 消息手动应答代码 4.RabbitMQ 持久化 4.1 队列如何实现持久化 4.2 消息实现持久化 5.不…

DBSCAN聚类

一、概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法&#xff0c;簇集的划定完全由样本的聚集程度决定。聚集程度不足以构成簇落的那些样本视为噪声点&#xff0c;因此DBSCAN聚类的方式也可以用于异常点的检测。 二、算法…

【音视频SDK测评】线上K歌软件开发技术选型

摘要 在线K歌软件的开发有许多技术难点&#xff0c;需考虑到音频录制和处理、实时音频传输和同步、音频压缩和解压缩、设备兼容性问题等技术难点外&#xff0c;此外&#xff0c;开发者还应关注音乐版权问题&#xff0c;确保开发的应用合规合法。 前言 前面写了几期关于直播 …

SpringBoot+SSM实战<一>:打造高效便捷的企业级Java外卖订购系统

文章目录 项目简介项目架构功能模块管理端用户端 技术选型用户层网关层应用层数据层工具 项目优缺点结语 黑马程序员最新Java项目实战《苍穹外卖》&#xff1a;让你轻松掌握SpringBootSSM的企业级开发技巧项目简介 《苍穹外卖》是一款为餐饮企业&#xff08;餐厅、饭店&#x…

leetcode 1290.二进制链表转整数

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;二进制链表转整数 ps&#xff1a; 1 0 1 (0 << 1) 1 0 1 1 (1 << 1) 0 2 0 2 (2 << 1) 1 4 1 5代码&#xff1a; int getDecimalValue(struct ListNode* head) {int ans 0;while(head !…

滇医通微信小程序分析笔记

注意 本文章仅供学习交流使用&#xff0c;如果你是铁粉你就会知道博主之前发布过一篇相关的文章&#xff0c;但是由于代码涉及到法律相关所以就隐藏了&#xff0c;两年的时间过去了&#xff0c;因为女朋友已经早早安排上了&#xff0c;所以就搁置了&#xff0c;本次不做代码分…

视频监控汇聚平台EasyCVR视频分享页面WebRTC流地址播放不了是什么原因?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

微信小程序nodejs+vue+uniapp个人家庭理财系统--论文

随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。网上管理&#xff0c;它将是直接管理家庭理财系统app的最新形式。本论文是以构建家庭理财系统app为目标&#xff0c;使用nodejs技术制作&…