MongoDB入门教程

news2024/9/24 15:24:40

参考文档

https://blog.csdn.net/qq_26889387/article/details/116205819
https://blog.csdn.net/ncepu_Chen/article/details/98725104

1. 简介

​ MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

​ MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

在这里插入图片描述

适用场景:

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

不适用场合

  • 高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序

  • 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

2. MAC安装

		homerew安装:brew install mongodb-community@6.0
    安装目录:   /usr/local/opt/mongodb-community
    配置文件:   /usr/local/etc/mongod.conf
    数据目录:   /usr/local/var/mongodb
    日志目录:   /usr/local/var/log/mongodb
    
    前台启动:   mongod --config /usr/local/etc/mongod.conf
    后台启动:   brew services start mongodb-community
    后台停止:   brew services stop mongodb-community
    控制面板:   mongosh
    查看版本号:  mongod -version

3. 基于Mongo Shell的CRUD操作

3.1 数据库操作
    show dbs:           查看所有数据库
    use 数据库名:        切换数据库或创建数据库(存在则切换,不存在则创建)
    db:                 查看当前所属数据库
    db.dropDatabase()    删除数据库
3.2 集合操作[表]:
   	show collections:   查看集合
    db.stu.drop():      删除集合
    db.createCollection("stu") 创建集合
PS:
    不手动创建集合:
        向不存在的集合中第一次加入数据时,集合会被创建出来
    手动创建集合:
        db.createCollection("stu")
        db.createCollection("stu", {capped:true, size:10})
        参数crapped:默认值为false表示不设置上限,值为true表示设置上限
        参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
3.3 文档操作

增加操作: insert、insertOne、insertMany

db.stu.insert({name:'zhangsan', age:1})                  	 		 插入一条文档记录
db.stu.insert([{name:"lisi", age:12},{name:"wangwu", age:23}]) 插入多条文档记录
db.stu.insertOne({name:'zhangsan', gender:1})                  	 	 插入一条文档记录
db.stu.insertMany([{name:"lisi", age:12},{name:"wangwu", age:23}]) 插入多条文档记录

// 向numbers集合添加2w条数据

var arr == [];
for(var i=1;i<=20000;i++){
	arr.push({num:i});
}
db.numbers.inser(arr)

查询操作: find

db.stu.find()		
db.stu.find({name: "zhangsan", age: 12})   				AND
db.stu.find({$or:[{age: 12},{name: "zhangsan"}]}) OR
db.stu.find({age: {$in:[12, 23]}}) 							  IN范围查询	
db.stu.find({age: {$gt: 23}})											age>23 ($gt:>、$gte:>=、$lt:<、$lte:<=、$eq:=、$ne:!=)
db.stu.find({age: {$gt: 23,$lt:50}})							23<age<50 
db.stu.find().limit(10)														显示前十条数据
db.stu.find().skip(10)														跳过前10条数据,limit配合进行分页显示
db.stu.find().skip((pageNum-1)*pageSize).limit(pageSize)	分页查询										
db.stu.find({},{name:1, age: 1})   								指定查询列名
db.stu.find().sort({age: 1, name: -1})						排序:1 为升序排列,而 -1 是用于降序
db.stu.find().count()															查询数量
db.stu.find({"hobby.movies": "hero"})						  内嵌文档查询,hobby也是一个文档

修改操作: updateOne、updateMany

db.stu.update({name:"zhupeng"}, {$set: {age: 99}})		// Collection.update() is deprecated.
db.stu.updateOne({name:"zhupeng"}, {$set: {age: 99}})
db.stu.updateMany({name:"zhupeng"}, {$set: {age: 99}})
db.stu.updateOne({name:"zhupeng"}, {$unset: {age: 99}}) // 删除字段age
db.stu.update({name:"zhupeng"}, {$push: {address: "nanjing"}})		 // 向数组中添加一个元素
db.stu.update({name:"zhupeng"}, {$addToSet: {address: "nanjing"}}) // 向数组中添加一个元素,如果元素已存在,则不添加

删除操作: remove、deleteOne、deleteMany

> db.user.remove(id)	移除对应id的行	
> db.user.remove({"hobby.city": "北京"})			 移除对应的行	
> db.user.remove({})													删除文档所有文档,等价于db.stu.drop()
> db.user.deleteOne({age: 23})								删除 第一个匹配的元素 只删除一个
> db.user.deleteMany({age: {$in: [23,24]}})   删除所有匹配条的元素

3.4 文档之间的关系

一对一[内嵌文档]

db.wifeAndHusband.insertOne({name: "guojing", husband: {name :"huangrong"}})

一对多[用户-订单表]

db.users.insertMany([{name: "zhangsan"},{name: "lisi"}])

db.order.insertOne({list: ["apple","orange","pear"], user_id:"ObjectId("637e04164fa4b8728f6e415c")"})
db.order.insertOne({list: ["apple"], user_id: ObjectId("637e04164fa4b8728f6e415d")})


// 查询张三的订单信息
var userId = db.users.find({name: "zhangsan"})._id
db.order.find({user_id: userId})

多对多

db.teachers.insertMany([{name: "laoshi001"},{name: "laoshi001"]})
db.stus.insertOne({name: "zhangsan"}, teachers: ["ObjectId("637e04164fa4b8728f6e415c"), "ObjectId("637e04164fa4b8728f6e415c")]})

4. Springboot集成MongoDB

4.1 引入依赖

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

4.2 配置文件

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

4.3 测试

package cn.hyperchain.mongo;

import com.jayway.jsonpath.Criteria;
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.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.CriteriaDefinition;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * @Author zhupeng
 * @Date 2022/11/21 16:42
 */
@SpringBootTest
public class MongoApplicationTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    // 添加
    @Test
    public void createUser() {
        MongoUser user = new MongoUser();
        user.setAge(20);
        user.setName("test");
        System.out.println(mongoTemplate.insert(user));
    }

    @Test
    public void findUser() {
        // 查询所有
        List<MongoUser> userList = mongoTemplate.findAll(MongoUser.class);
        System.out.println(userList);

        // 根据id查询
        MongoUser user = mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", MongoUser.class);
        System.out.println("user = " + user);

        // 条件查询
        Query query = new Query((CriteriaDefinition) Criteria.where("name").is("test").and("age").is(20));
        List<MongoUser> userList2 = mongoTemplate.find(query, MongoUser.class);
        System.out.println(userList2);

        //模糊查询
        String name = "est";
        String regex = String.format("%s%s%s", "^.*", name, ".*$");
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Query query2 = new Query((CriteriaDefinition) Criteria.where("name").regex(pattern));
        List<MongoUser> userList3 = mongoTemplate.find(query2, MongoUser.class);
        System.out.println(userList3);
    }


    //分页查询
    @Test
    public void findUsersPage() {
        String name = "est";
        int pageNo = 1;
        int pageSize = 10;

        Query query = new Query();
        String regex = String.format("%s%s%s", "^.*", name, ".*$");
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        query.addCriteria((CriteriaDefinition) Criteria.where("name").regex(pattern));
        int totalCount = (int) mongoTemplate.count(query, MongoUser.class);
        List<MongoUser> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), MongoUser.class);

        Map<String, Object> pageMap = new HashMap<>();
        pageMap.put("list", userList);
        pageMap.put("totalCount", totalCount);
        System.out.println(pageMap);
    }

    // 修改
    @Test
    public void updateUser() {
        MongoUser user = mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", MongoUser.class);
        user.setName("test_1");
        user.setAge(25);
        Query query = new Query((CriteriaDefinition) Criteria.where("_id").is(user.getId()));
        Update update = new Update();
        update.set("name", user.getName());
        update.set("age", user.getAge());
        UpdateResult result = mongoTemplate.upsert(query, update, MongoUser.class);
        long count = result.getModifiedCount();
        System.out.println(count);
    }

    //删除操作
    @Test
    public void delete() {
        Query query = new Query((CriteriaDefinition) Criteria.where("_id").is("5ffbfa2ac290f356edf9b5aa"));
        DeleteResult result = mongoTemplate.remove(query, MongoUser.class);
        long count = result.getDeletedCount();
        System.out.println(count);
    }
}

服务器安装MongoDB:


1.到mongodb官网下载对应系统的压缩包,(注意不要选错系统版本,也可以在本地下载好后上传到云服务器)
	地址:Downloads for linux (mongodb.org) https://www.mongodb.com/try/download/community

2.默认下载路径是到用户目录下的Downloads目录,将其解压
sudo tar -xvf mongodb-linux-x86_64-rhel80-6.0.2.tar -C /usr/local
mv mongodb-linux-x86_64-rhel80-6.0.2 mongodb

4.配置系统文件profile
sudo vi /etc/profile
export MONGODB_HOME=/usr/local/mongodb  
export PATH=$PATH:$MONGODB_HOME/bin

注意保存后要重启系统配置:
source /etc/profile

5.创建用于存放数据和日志文件的文件夹,并修改其权限增加读写权限
cd /usr/local/mongodb
sudo mkdir -p data/db
sudo chmod 777 data 
sudo chmod 777 db 

sudo mkdir logs
sudo chmod 777 logs 
cd logs
sudo touch mongodb.log
sudo chmod 777 mongodb.log 

6.mongodb启动配置,进入到bin目录,增加一个配置文件:
cd /usr/local/mongodb/bin  
sudo vi mongodb.conf
dbpath = /usr/local/mongodb/data/db #数据文件存放目录  
logpath = /usr/local/mongodb/logs/mongodb.log #日志文件存放目录  
port = 27017  #端口  
fork = true  #以守护程序的方式启用,即在后台运行  

7. 启动mongod数据库服务,以配置文件的方式启动
cd /usr/local/mongodb/bin
./mongod -f mongodb.conf

8.连接mongodb数据库
./mongo

超级大坑:

6.x版本bin目录没有mongo文件了!!!,可以使用5.x提供的mongo连接数据库
在这里插入图片描述

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

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

相关文章

PaddleOCR基于PPOCRv4的垂类场景模型微调——手写文字识别

PaddleOCR手写文字识别 一. 项目背景二. 环境配置三. 数据构造四. 模型微调五. 串联推理六. 注意事项七. 参考文献 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;ORC是指对包含文本资料的图像文件进行分析识别处理&#xff0c;获取文字…

MB85RC铁电 FRAM驱动(全志平台linux)

测试几天发现一个bug&#xff0c;就是无法一次读取32个字节的数据&#xff0c;1-31,33,128,512都试过了&#xff0c;唯独无法读取32个字节&#xff0c;驱动未报错&#xff0c;但是读取的都是0&#xff0c;找不到原因&#xff0c;估计应该是全志iic驱动的问题&#xff0c;暂时没…

Golang Copy()方法学习

前言 主要是涉及到深浅拷贝相关的&#xff0c;但是在看的一个资料过程中发现他有错…并且一系列&#xff0c;复制粘贴他的&#xff0c;也都错了。 错误文章指路 很显然&#xff0c;Copy是深拷贝啊&#xff01;&#xff01;&#xff01; Copy功能 copy的代码很少&#xff0c…

如何证明线性规划系统最优解存在性

先给定simplex所对应的算法的流程图&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 上图是线性规划算法的基本流程描述&#xff0c;但是给定的基本流程描述中的一些步骤还需要进一步的进行分解&#xff0c;第一步是如何将线性规划系统依靠算…

【Java】Base理论的核心思想和理论三要素

目录 简介 BASE 理论的核心思想 BASE 理论三要素 1. 基本可用 2. 软状态 3. 最终一致性 总结 简介 BASE 是 Basically Available&#xff08;基本可用&#xff09; 、Soft-state&#xff08;软状态&#xff09; 和 Eventually Consistent&#xff08;最终一致性&#xf…

第 387 场 LeetCode 周赛题解

A 3069. 将元素分配到两个数组中 I 模拟 class Solution { public:vector<int> resultArray(vector<int> &nums) {vector<int> r1{nums[0]}, r2{nums[1]};for (int i 2; i < nums.size(); i) {if (r1.back() > r2.back())r1.push_back(nums[i]);e…

04. Nginx入门-Nginx WEB模块

测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径&#xff1a;/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…

使用html网页播放多个视频的几种方法

前言 因为项目测试需要&#xff0c;我需要可以快速知道自己推流的多路视频流质量&#xff0c;于是我想到可以使用html网页来播放视频&#xff0c;实现效果极其简单&#xff0c;方法有好几种&#xff0c;以下是几种记录&#xff1a; 注意&#xff1a;测试过&#xff0c;VLC需要使…

97 spring 中的泛型类型注入

前言 呵呵 同样是 最近同事碰到的一个问题 他不太懂 英语, 看到的说明是 缺少一个 RedisTemplate 的实例, 但是找到了一个 RedisTemplate 的实例 呵呵 和我这里 spring 版本似乎是不太一样, 错误信息 有一些差异 以下环境基于 jdk8 spring-5.0.4-RELEASE 测试用例 BeanCon…

23种设计模式——工厂方法模式

定义&#xff1a; 一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。 工厂方法通用类图&#xff1a; 这个图更好理解 在工厂方法模式中&#xff0c;抽象产品类Product负责定义产品的共性&#xff0c;实现对事物最抽象的…

人大金仓KingbaseES:银河麒麟V10安装

人大金仓KingbaseES&#xff1a;银河麒麟V10安装 众所周知的原因&#xff0c;为了响应国家信创支持国产操作系统和数据库&#xff0c;现在我们公司的项目要从开源数据库PostgreSQL切换到人大金仓KingbaseES数据库&#xff08;本质是早期版本的PostgreSQL&#xff09;。使用的是…

自适应控制算法讲解-案例(附C代码)

目录 一、自适应控制算法的基本原理 二、自适应控制算法分类 三、案例 3.1自适应PID控制 1&#xff09; 模型识别 2&#xff09;动态调整PID参数逻辑 3&#xff09;PID控制器 自适应控制算法是一种高级控制算法&#xff0c;用于处理那些参数不确定或者动态变化的系统。这类…

Elasticsearch:向量相似度计算 - 可笑的速度

作者&#xff1a;Chris Hegarty 任何向量数据库的核心都是距离函数&#xff0c;它确定两个向量的接近程度。 这些距离函数在索引和搜索期间执行多次。 当合并段或在图表中导航最近邻居时&#xff0c;大部分执行时间都花在比较向量的相似性上。 对这些距离函数进行微观优化是值…

AI-数学-高中-34概率-古典概率模型

原作者视频&#xff1a;【概率】【一数辞典】3古典概型_哔哩哔哩_bilibili 等可能性&#xff1a;每个样本点出现的可能性是相同的。 随机事件A的发生事件A的样本点数k / 样板空间总样本点数n。 示例1&#xff1a; 示例2&#xff1a;

[DevOps云实践] IaaC:通过CloudWatch Agent和自定义Metric监视服务器

[DevOps云实践] IaaC:通过CloudWatch Agent和自定义Metric监视服务器 现在有许多第三方工具可以用于监控EC2实例。尽管事实如此,我想为您提供使用AWS原生资源和工具(如AWS CloudWatch、CloudWatch Agent和CloudFormation)快速设置EC2监控所需的所有信息。 首先,您应该知…

2024.3.4

思维导图 作业1&#xff1a;广播 发送端&#xff1a; #include<myhead.h> int main(int argc, const char *argv[]) {//创建套接字int sfd socket(AF_INET,SOCK_DGRAM,0);if(sfd -1){perror("sockeet error");return -1;}//设置当前套接字允许广播属性int …

idea中引入新JDK环境

在不同的项目中往往会需要不同的运行环境&#xff0c;那么如何下载一个新的环境并运用到idea中呢&#xff1f; 下面给出的就是oracle官网&#xff0c;以JDK17为例教大家如何下载 Java Archive Downloads - GraalVM for JDK 17https://www.oracle.com/java/technologies/javase…

End-to-End Weakly-Supervised SemanticSegmentation with Transformers

摘要 弱监督语义分割&#xff08;WSSS&#xff09;使用图像级标签是一项重要且具有挑战性的任务。由于高训练效率&#xff0c;端到端的WSSS解决方案受到社区越来越多的关注。然而&#xff0c;当前的方法主要基于卷积神经网络&#xff0c;并未正确地探索全局信息&#xff0c;因…

在Visual Studio配置C++的netCDF库的方法

本文介绍在Windows电脑的Visual Studio软件中&#xff0c;配置C 语言最新版netCDF库的方法。 netCDF&#xff08;Network Common Data Form&#xff09;是一种用于存储、访问和共享科学数据的文件格式和库&#xff0c;其提供了一种灵活的方式来组织、描述和存储多维数据&#x…

【系统架构设计师考试大纲】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱考试目标考试要求考试题目题型分析计算机基础知识&#xff08;20%&#xff09;信息化战略与规划&#xff08;9%&#xff09;软件工程&#xff08;25%&#xff09;系统架构设计&#xff08;35%&#xff09;信…