MongoDB快速入门

MongoDB 概念

什么是 MongoDB

MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库,由C++语言编写。

目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。

在MongoDB中数据主要的组织结构就是数据库、集合和文档,文档存储在集合当中,集合存储在数据库中。

MongoDB中每一条数据记录就是一个文档,数据结构由键值(key=>value)对组成

文档类似于 JSON 对象,它的数据结构被叫做BSON(Binary JSON)。

下表将帮助您更容易理解MongoDB中的一些概念:

RDBMS(关系型数据库)

MongoDB

数据库

数据库

表格

集合

文档

字段

表联合

嵌入文档

主键

_id

安装和启动(docker方式)

拉取镜像

docker pull mongo:7.0.0

创建和启动容器

需要在宿主机建立文件夹

rm -rf /opt/mongomkdir -p /opt/mongo/data/dbdocker run -d --restart=always -p 27017:27017 --name mongo -v /opt/mongo/data/db:/data/db mongo:7.0.0

进入容器

docker exec -it mongo mongosh

基本命令

show dbs # 查看数据库
db.version() #当前db版本
db.getMongo() #查看当前db的链接机器地址
db.help() #帮助
quit() #退出命令行

客户端远程远程连接

MongoDB适用场景

MongoDB不需要去明确指定一张表的具体结构,对字段的管理非常灵活,有很强的可扩展性。

支持高并发、高可用、高可扩展性,自带数据压缩功能,支持海量数据的高效存储和访问。

支持基本的CRUD、数据聚合、文本搜索和地理空间查询功能。

适用场景:

  • 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。
  • 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
  • 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。

例如:

弹幕、直播间互动信息、朋友圈信息、物流场景等

不适用场合:

  • 高度事务性系统:例如银行系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
  • 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

数据库操作

数据库操作

创建数据库

如果数据库不存在,则创建数据库,否则切换到指定数据库。

use tingshu

查看当前数据库

db.getName()

显示当前数据库状态

db.stats()

删除当前数据库

db.dropDatabase()

集合操作

创建集合

db.createCollection("User")

删除集合

db.User.drop()

文档操作

文档是一组键值(key-value)对。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

需要注意的是:

1、MongoDB区分类型和大小写。

2、MongoDB的文档不能有重复的键。

insert

向User集合插入一条记录。可以预先使用createCollection方法创建集合,也可以不创建集合,直接插入数据,那么集合会被自动创建

db.User.insert({name:'zhangsan',age:21,sex:true})

query

查询当前User集合中所有的记录

db.User.find()

查询当前User集合中name是zhangsan的记录

db.User.find({name:"zhangsan"})

update

只更新匹配到的第一条记录

db.User.update({age:21}, {$set:{name:100}}) 

更新匹配到的所有记录

db.User.update({age:21}, {$set:{age:99}}, {multi: true})

delete

删除一个文档

db.User.deleteOne({name:"lee"})

删除多个文档

db.User.deleteMany({ age: 21 })

删除所有文档(*)

db.User.remove({}) 

SpringBoot集成MongoDB

集成spring-data-mongodb

搭建项目

1.创建项目:mongo_demo

2.添加配置文件:

application.properties

spring.data.mongodb.database=mongodb_name
spring.data.mongodb.host=xx.xx.xx.xx
spring.data.mongodb.port=27017

添加实体
import lombok.Data;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;import java.util.Date;@Data
@Document("user") //指定mongodb中的集合名字
public class User {@Idprivate ObjectId id;private String name;private Integer age;private String email;private Date createDate;
}

添加Repository类
import com.itcam.mongodbcase.model.User;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;public interface UserRepository extends MongoRepository<User, ObjectId> {}

测试MongoRepository 
import com.itcam.mongodbcase.model.User;
import org.bson.types.ObjectId;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.*;import java.util.Date;
import java.util.List;
import java.util.Optional;@SpringBootTest
public class MongoRepositoryTest {@Autowiredprivate UserRepository userRepository;// 插入@Testpublic void testCreateUser() {User user = new User();user.setName("Lee");user.setAge(19);user.setEmail("cammy@163.com");user.setCreateDate(new Date());userRepository.save(user);}// 查询所有@Testpublic void testFindAll() {List<User> userList = userRepository.findAll();System.out.println("userList = " + userList);}// 根据id查询@Testpublic void testFindById() {Optional<User> optional = userRepository.findById(new ObjectId("671823c9224061033448a34f"));boolean present = optional.isPresent();if (present) {User user = optional.get();System.out.println("user = " + user);}}// 条件查询@Testpublic void testFindAllExample() {User user = new User();user.setAge(18);Example<User> example = Example.of(user);List<User> userList = userRepository.findAll(example);System.out.println("userList = " + userList);}// 排序条件@Testpublic void testFindAllSort() {Sort sort = Sort.by(Sort.Direction.DESC, "age");List<User> userList = userRepository.findAll(sort);System.out.println("userList = " + userList);}// 分页查询@Testpublic void testFindAllPage() {// 设置每页显示的条数// Pageable pageable = Pageable.ofSize(2);PageRequest pageRequest = PageRequest.of(0, 10);Page<User> page = userRepository.findAll(pageRequest);int totalPages = page.getTotalPages();List<User> userList = page.getContent();System.out.println("userList = " + userList);System.out.println("totalPages = " + totalPages);}// 更新@Testpublic void testUpdate() {// 先查询,再更新Optional<User> optional = userRepository.findById(new ObjectId("671823c9224061033448a34f"));if (optional.isPresent()) {User user = optional.get();user.setAge(99);// user中包含id,就会执行更新userRepository.save(user);System.out.println("user = " + user);}}// 删除@Testpublic void testDelete() {userRepository.deleteById(new ObjectId("671823c9224061033448a34f"));}
}

测试MongoTemplate
import com.itcam.mongodbcase.model.User;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
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 java.util.Date;
import java.util.regex.Pattern;@SpringBootTest
public class MongoTemplateTest {@Autowiredprivate MongoTemplate mongoTemplate;// 添加@Testpublic void testCreateUser() {for (int i = 0; i < 20; i++){User user = new User();user.setName("Cammy"+i);user.setAge(21);user.setEmail("cammy@163.com");user.setCreateDate(new Date());mongoTemplate.insert(user);}}// 查询所有@Testpublic void testFindAll() {mongoTemplate.findAll(User.class).forEach(System.out::println);}// 根据id查询@Testpublic void testFindById() {User user = mongoTemplate.findById("6718331e22e6386d283d783d", User.class);System.out.println("user = " + user);}// 修改@Testpublic void testUpdate() {Criteria criteria = Criteria.where("_id").is("6718331e22e6386d283d783d");Query query = new Query(criteria);Update update = new Update();update.set("age", 99);update.set("name","wukaiming");UpdateResult result = mongoTemplate.upsert(query, update, User.class); // 改一条// UpdateResult result = mongoTemplate.updateMulti(query, update, User.class); // 改多条long count = result.getModifiedCount();System.out.println("count = " + count);}// 删除@Testpublic void testRemove() {Criteria criteria = Criteria.where("_id").is("6718331e22e6386d283d783d");Query query = new Query(criteria);DeleteResult result = mongoTemplate.remove(query, User.class);long count = result.getDeletedCount();System.out.println("count = " + count);}// 条件查询 and@Testpublic void testFindByAnd() {Criteria criteria = Criteria.where("name").is("Lee").and("age").is(19);Query query = new Query(criteria);mongoTemplate.find(query, User.class).forEach(System.out::println);}// 模糊查询@Testpublic void testFindByLike() {// select * from album where album_name like ?%Pattern pattern = Pattern.compile("^Lee", Pattern.CASE_INSENSITIVE);Criteria criteria = Criteria.where("name").regex(pattern);Query query = new Query(criteria);mongoTemplate.find(query, User.class).forEach(System.out::println);}// 分页查询@Testpublic void testFindByPage() {Query query = new Query();// 查询总记录数long count = mongoTemplate.count(query, User.class);System.out.println("count = " + count);// 分页+排序PageRequest pageRequest = PageRequest.of(0, 10, Sort.by(Sort.Direction.ASC, "age"));query = new Query().with(pageRequest);// 分页查询mongoTemplate.find(query, User.class).forEach(System.out::println);}}

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

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

相关文章

Spring boot 配置文件的加载顺序

Spring Boot 在启动时会扫描以下位置的 application.properties 或者 application.yml 文件作为全局配置文件&#xff1a; –file:./config/–file:./–classpath:/config/–classpath:/以下是按照优先级从高到低的顺序&#xff0c;如下所示&#xff1a; Spring Boot 会全部扫…

医院信息化与智能化系统(10)

医院信息化与智能化系统(10) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

自由学习记录(15)

Java注解 else if的省略问题&#xff08;可能看花&#xff09; else if也是取最近的if连通&#xff0c;看上去加了{}就可以正常执行了&#xff0c;缩进要命&#xff0c;不提示真容易看错&#xff0c; 组合数公式和数组参数 在 C 中&#xff0c;数组作为函数参数时&#xff0c;…

【课件分享】蓝光光盘及光驱团标解读

关注我们 - 数字罗塞塔计划 - 10月26日&#xff0c;非常感谢陶光毅老师携特邀嘉宾许斌老师和游泳总能够在百忙之中抽空莅临数字罗塞塔计划直播间&#xff0c;为大家带来蓝光光盘及光驱团标解读。作为标准的起草者&#xff0c;你们的专业见解和宝贵经验&#xff0c;让我们对T/CE…

Lucas带你手撕机器学习——SVM支持向量机

#1024程序员节&#xff5c;征文# 支持向量机&#xff08;SVM&#xff09;的详细讲解 什么是SVM&#xff1f; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归的监督学习算法。它的主要任务是从给定的数据中找到一个最佳的决策…

Windows/Linux(服务器)查看显卡的名称

文章目录 1. 使用 nvidia-smi&#xff08;适用于 NVIDIA 显卡&#xff09;2. 使用 wmic 命令&#xff08;Windows&#xff09; 1. 使用 nvidia-smi&#xff08;适用于 NVIDIA 显卡&#xff09; 如果服务器上安装了 NVIDIA 驱动程序&#xff0c;可以使用 nvidia-smi 工具来查看…

vue使用xlsx以及file-saver进行下载xlsx文件以及Unit8Array、ArrayBuffer、charCodeAt的使用

先说Unit8Array、ArrayBuffer、charCodeAt的使用下面会用到这三个 Unit8Array&#xff1a;数组类型表示一个 8 位无符号整型数组&#xff0c;创建时内容被初始化为 0。创建完后&#xff0c;可以以对象的方式或使用数组下标索引的方式引用数组中的元素。 new Uint8Array(); //…

Docker中如何控制服务启动顺序实现探讨

文章目录 一、Docker概述二、Docker三剑客1. Compose2. Machine3. Swarm 三、简要需求1. 样例工程2. 代码模块3. 调用方向4. 期望启动顺序 四、思路分析1.各走各路1.&#xff09;docker-compose -f指定不同配置文件2.&#xff09;docker-compose up -d service-name指定服务名3…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则&#xff08;上篇&#xff09; 8.1.1 图层的定义&#xff08;上篇&#xff09;8.1.2 图层的…

巡飞单机多旋翼无人机技术详解

巡飞单机多旋翼无人机技术是一种集成了多种先进技术的无人机系统&#xff0c;它具备自主飞行、长续航、高精度控制以及多任务负载能力等特点。以下是对巡飞单机多旋翼无人机技术的详细解析&#xff1a; 一、机架与结构设计 1.材料选择&#xff1a;为了确保无人机能够承载足够…

cmake命令使用

有关cmake的入门简介可参见 CMake入门教程_cmake静态test.c编译-CSDN博客 本文是进一步对cmake常用命令做进一步详述 配置项目 cmake_minimum_required 作用 配置cmake最低版本 用法 cmake_minimum_required(VERSION 3.0) project 作用&#xff1a;设置预设变量 PROJEC…

深度学习(一)基础:神经网络、训练过程与激活函数(1/10)

深度学习基础&#xff1a;神经网络、训练过程与激活函数 引言&#xff1a; 深度学习作为机器学习的一个子领域&#xff0c;近年来在人工智能的发展中扮演了举足轻重的角色。它通过模仿人脑的神经网络结构&#xff0c;使得计算机能够从数据中学习复杂的模式和特征&#xff0c;…

dmsql日志分析工具部署与使用DM8/DM7

dmsql日志分析工具部署与使用DM8/DM7 1 环境介绍2 JAVA 环境变量配置2.1 Os Kylin 10 JAVA 环境变量配置2.2 Windos7 JAVA环境变量配置 3 数据库配置3.1 数据库初始化参数3.2 数据库创建表 4 配置DMLOG日志分析工具4.1 Kylin v10 配置DMLOG日志分析工具4.2 执行日志分析4.3 Win…

linux面试题复习

前言 现在只是初版&#xff0c;很多格式我还没有改好&#xff0c;会慢慢修改订正。 可能用到的网址&#xff1a;在线 EXCEL 到 MARKDOWN 转换器。 参考了很多网上的面试题和外网上的面试题&#xff1a; 参考文档&#xff1a; 程序员的50大Linux面试问题及答案 Top 60 Linux …

MySQL——test4(综合练习)

目录 建库建表&#xff08;题目&#xff09;处理表1. 修改student 表中年龄(sage)字段属性&#xff0c;数据类型由int 改变为smallint2. 为Course表中Cno 课程号字段设置索引,并查看索引3. 为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引&#xff0c;索引名为SC_INDE…

数据结构:“小猫钓鱼游戏”

一&#xff1a;题目 栈和队列的综合应用&#xff1a;“小猫钓鱼”的游戏规则是&#xff1a;将一副扑克牌平均分成两份&#xff0c;每人拿一份。玩家甲先拿出手中的第一张扑克牌放在桌上&#xff0c;然后玩家乙也拿出手中的第一张扑克牌&#xff0c;并放在玩家甲刚打出的扑克牌的…

前端算法:树(力扣144、94、145、100、104题)

目录 一、树&#xff08;Tree&#xff09; 1.介绍 2.特点 3.基本术语 4.种类 二、树之操作 1.遍历 前序遍历&#xff08;Pre-order Traversal&#xff09;&#xff1a;访问根节点 -> 遍历左子树 -> 遍历右子树。 中序遍历&#xff08;In-order Traversal&#xf…

STM32L476芯片在KEIL环境下BOOT跳转APP注意事项

BOOT工程 分配BOOT程序地址、设置参数地址、APP程序地址、下载缓冲区地址 #define BOOT_SECTOR_ADDR 0x08000000 #define BOOT_SECTOR_SIZE 0x0000A000 #define SETTING_SECTOR_ADDR 0x0800A000 #define SETTING_SECTOR_SIZE 0x00002000 #define APP_S…

R语言 | paletteer包:拥有2100多个调色板!

看到 PMID:39024031 文章的代码中&#xff0c;有颜色设置的语句&#xff1a; pal <- paletteer_d("ggsci::category20_d3")[c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)]DimPlot(MM,reduction umap,group.by "sample",label F,pt.size 0.1,c…

从零开始机器学习——基于PyTorch构建你的第一个线性回归模型

随着人工智能技术的迅猛发展&#xff0c;机器学习成为了现代科技领域中最炙手可热的话题之一。然而&#xff0c;对于初学者来说&#xff0c;机器学习似乎总是充满了复杂的理论和难以理解的概念。本文将带你从零开始&#xff0c;使用PyTorch深度学习框架&#xff0c;构建一个最简…