MongoDB快速入门

目录

什么是MongoDB?

MongoDB与关系型数据库对比

MongoDB应用场景

MongoDB语法

数据库操作

集合操作

安全认证

MongoDB插入指令

MongoDB查询指令

MongoDB更新指令

MongoDB删除指令

内嵌文档和数组

嵌套型的数组

固定(封顶)集合


什么是MongoDB?

        MongoDB是一个文档数据库(以 JSON 为数据模型),由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。

        MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,数据格式是BSON,一种类似JSON的二进制形式的存储格式,简称Binary JSON ,和JSON一样支持内嵌的文档对象和数组对象,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。

MongoDB与关系型数据库对比

MongoDB应用场景

1. 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新;

2. 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来;

3. 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能;

4. 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析;

5. 视频直播,使用 MongoDB 存储用户信息、礼物信息等;

6. 大数据应用,使用云数据库MongoDB作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态。

MongoDB语法

数据库操作
#查看所有库
show dbs
# 切换到指定数据库,不存在则创建
use test
#如果指定的数据库不存在,MongoDB 会在插入第一条文档时自动创建它
db.myCollection.insertOne({ key: "value" })
# 删除当前数据库  
db.dropDatabase()

集合操作
#查看集合
show collections
#创建集合
db.createCollection("emp")
#删除集合
db.emp.drop()
#删除当前数据库所有用户
db.dropAllUser()

安全认证
# 设置管理员用户名密码需要切换到admin库
use admin
#创建管理员
db.createUser({user:"awei",pwd:"123456",roles:["root"]})
# 查看所有用户信息
show users
#删除用户
db.dropUser("awei")

             

常用权限

MongoDB插入指令

使用insertOne()或insertMany()方法插入文档。

// 插入一个文档
db.collection.insertOne({ key: value });

db.employees.insertOne({
  "name": "John Doe",
  "age": 30,
  "salary": 50000.0
})


// 插入多个文档
db.collection.insertMany([{ key1: value1 }, { key2: value2 }]);

db.employees.insertMany([{
    "name": "zhangsan",
    "age": 30,
    "salary": 5000.0
}, {
    "name": "lisi",
    "age": 25,
    "salary": 2000.0
}])
MongoDB查询指令
// 查询所有文档
db.employees.find();

// 查询特定条件的文档,例如年龄为30的员工
db.employees.find({ "age": 30 });

// 以格式化的方式来显示所有文档
db.collection.find().pretty()

查询条件对照表

查询逻辑对照表

查询逻辑运算符

$lt: 存在并小于

$lte: 存在并小于等于

$gt: 存在并大于

$gte: 存在并大于等于

$ne: 不存在或存在但不等于

$in: 存在并在指定数组中

$nin: 不存在或不在指定数组中

$or: 匹配两个或多个条件中的一个

$and: 匹配全部条件

MongoDB更新指令
// 更新单个文档,将John Doe的薪水增加到60000.0
db.employees.updateOne({ "name": "zhangsan" }, { $set: { "salary": 60000.0 } });

// 更新多个文档,将所有年龄大于等于30的员工薪水增加到55000.0
db.employees.updateMany({ "age": { $gte: 25 } }, { $set: { "salary": 55000.0 } });
MongoDB删除指令
// 删除单个文档,删除名为John Doe的员工
db.employees.deleteOne({ "name": "zhangsan" });

// 删除多个文档,删除所有年龄小于25的员工
db.employees.deleteMany({ "age": { $lt: 25 } });

// 删除当前数据库
db.dropDatabase()

注意:deleteMany命令需要对查询范围内的文档逐个删除,如果希望删除整个集合,则使用drop命令会更加高效。

findOneAndDelete

       deleteOne命令在删除文档后只会返回确认性的信息,如果希望获得被删除的文档,则可以使用findOneAndDelete命令。(每次只能删除一个,如果两个age=30的数据,一次删除一个)

db.employees.findOneAndDelete({age:30})
内嵌文档和数组

       以book文档为例,一个文档中可以包含作者的信息,包括作者名称、性别、家乡所在地,一个显著的优点是,当我们查询book文档的信息时,作者的信息也会一并返回。

db.createCollection("books")
db.books.insert({
    title: "时间简史",
    author: {
        name:"霍金",
        gender:"男",
        hometown:"英国"
    }
})

查询霍金的作品

db.books.find({"author.name":"霍金"})

修改霍金的家乡所在地

db.books.updateOne({"author.name":"霍金"},{$set:{"author.hometown":"中国"}})

数组

db.books.updateOne({"author.name":"霍金"},{$set:{tags:["旅行","随笔","散文","爱情","文学"]}})

查询数组元素

# 会查询到所有的tags
db.books.find({"author.name":"霍金"},{title:1,tags:1})
#利用$slice获取最后一个tag
db.books.find({"author.name":"霍金"},{title:1,tags:{$slice:-1}})

数组末尾追加元素,可以使用$push操作符

db.books.updateOne({"author.name":"霍金"},{$push:{tags:"猎奇"}})

$push操作符可以配合其他操作符,一起实现不同的数组修改操作,比如和$each操作符配合可以用于添加多个元素

db.books.updateOne({"author.name":"三毛"},{$push:{tags:{$each:["伤感","想象力"]}}})

如果加上$slice操作符,那么只会保留经过切片后的元素

db.books.updateOne({"author.name":"三毛"},{$push:{tags:{$each:["伤感","想象力"],$slice:-3}}})

根据元素查询

#会查出所有包含伤感的文档
db.books.find({tags:"伤感"})
# 会查出所有同时包含"伤感","想象力"的文档
db.books.find({tags:{$all:["伤感","想象力"]}})
嵌套型的数组

数组元素可以是基本类型,也可以是内嵌的文档结构

{
    tags:[
        {tagKey:xxx,tagValue:xxxx},
        {tagKey:xxx,tagValue:xxxx}
    ]
}

这种结构非常灵活,一个很适合的场景就是商品的多属性表示

        

 一个商品可以同时包含多个维度的属性,比如尺码、颜色、风格等,使用文档可以表示为:

db.goods.insertMany([{
    name:"羽绒服",
    tags:[
        {tagKey:"size",tagValue:["M","L","XL","XXL","XXXL"]},
        {tagKey:"color",tagValue:["黑色","宝蓝"]},
        {tagKey:"style",tagValue:"韩风"}
    ]
},{
    name:"羊毛衫",
    tags:[
        {tagKey:"size",tagValue:["L","XL","XXL"]},
        {tagKey:"color",tagValue:["蓝色","杏色"]},
        {tagKey:"style",tagValue:"韩风"}
    ]
}])

当我们需要根据属性进行检索时,需要用到$elementMatch操作符:

#筛选出color=黑色的商品信息
db.goods.find({
    tags:{
        $elemMatch:{tagKey:"color",tagValue:"黑色"}
    }
})

如果进行组合式的条件检索,则可以使用多个$elemMatch操作符:

# 筛选出color=蓝色,并且size=XL的商品信息
db.goods.find({
    tags:{
        $all:[
            {$elemMatch:{tagKey:"color",tagValue:"黑色"}},
            {$elemMatch:{tagKey:"size",tagValue:"XL"}}
        ]  
    }
})
固定(封顶)集合

创建固定集合

db.createCollection("logs",{capped:true,size:4096,max:10})

       max:指集合的文档数量最大值,这里是10条
       size:指集合的空间占用最大值,这里是4096字节(4KB)
       这两个参数会同时对集合的上限产生影响。也就是说,只要任一条件达到阈值都会认为集合已经写满。其中size是必选的,而max则是可选的。

可以使用collection.stats命令查看文档的占用空间

db.logs.stats()

 将普通集合转换为固定集合

db.runCommand({"convertToCapped": "mycoll", size: 100000})

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

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

相关文章

线程的同步和互斥学习笔记

目录 互斥锁的概念和使用 线程通信-互斥 互斥锁的创建和销毁 申请锁-pthread_mutex_lock 释放锁-pthread_mutex_unlock 读写锁的概念和使用 死锁的避免 互斥锁的概念和使用 线程通信-互斥 临界资源 一次只允许一个任务(进程、线程)访问的共享资…

基于springboot+vue的台球管理系统

摘要 台球管理系统是一款基于Spring Boot和Vue.js技术栈构建的现代化系统,旨在提供全面而高效的台球场馆管理服务。该系统通过整合前后端技术,实现了场馆预约、会员管理、比赛统计等核心功能,为台球场馆管理员和玩家提供了便捷、智能的管理和…

leetcode第 381 场周赛最后一题 差分,对称的处理

第 381 场周赛 - 力扣(LeetCode)最后一题3017. 按距离统计房屋对数目 II - 力扣(LeetCode) dijkstra超时了,看了灵神的解题方法力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台,其…

Linux中普通用户如何使用sudo指令提升权限

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 普通用户为何无法使用sudo? 我们来看一下具体操作 总结 前言 世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力…

Facebook的区块链之路:探秘数字货币的未来

近年来,Facebook一直在积极探索区块链技术,并逐渐将目光聚焦在数字货币领域。从推出Libra项目到改名为Diem,Facebook一直在寻求在数字货币领域取得突破性进展。本文将深入探讨Facebook的区块链之路,揭示其对数字货币未来发展的影响…

LLM自回归解码

在自然语言处理(NLP)中,大型语言模型(LLM)如Transformer进行推理时,自回归解码是一种生成文本的方式。在自回归解码中,模型在生成下一个单词时会依赖于它之前生成的单词。 使用自回归解码的公式…

数字拆分--完全背包问题

一、题目 https://acm.ecnu.edu.cn/problem/3034/ 二、思路 本来算法就很弱,加上很久没刷题,做这道题真的是一言难尽~ 一开始我以为是找规律写递推式,写到f(9)的时候就觉得不对劲,又想了一会,还是没想到&#xff0…

【linux】Linux编译器-gcc/g++使用

先写一段代码演示 1 #include<stdio.h>2 #define M 1003 int main()4 {5 printf("hello linux");6 printf("hello linux");7 //printf("hello linux");8 //printf("hello linux");9 //printf("hello linux");10 //pri…

Win10 如何用powershell写个WOL开机脚本

环境&#xff1a; Win10 专业版 问题描述&#xff1a; Win10 如何用powershell写个WOL开机脚本 解决方案&#xff1a; 1.脚本内容 $mac b1-10-18-52-11-12 $macBytes $mac -split - | ForEach-Object { [byte](0x $_) } $broadcastAddress [byte[]](1..6 | ForEach-O…

【江科大】STM32:中断系统(理论)

文章目录 中断系统为什么要使用中断中断优先级中断嵌套STM32的中断系统如何管理这些中断NVIC的结构![请添加图片描述](https://img-blog.csdnimg.cn/c77b038fd63a4ddfbcd3b86f6dfe596b.png) 优先级窗口看门狗&#xff08;WWDG&#xff09;&#xff1a;外部中断模块的特性&#…

unity刷新grid,列表

获取UIGrid 组件&#xff0c;更新列表 listParent.GetComponent().repositionNow true;

【STM32】STM32F4中USB的CDC虚拟串口(VCP)使用方法

文章目录 一、前言二、STM32CubeMX生成代码2.1 选择芯片2.2 配置相关模式2.3 设置时钟频率2.4 生成代码2.5 编译并下载代码2.6 结果2.7 问题 三、回环测试3.1 打开工程3.2 添加回环代码3.3 编译烧录并测试 四、出现问题和解决方法4.1 烧录总是要自己插拔USB4.2 自己生成的工程没…

Python基础之数据库操作

一、安装第三方库PyMySQL 1、在PyCharm中通过 【File】-【setting】-【Python Interpreter】搜索 PyMySQL进行安装 2、通过PyCharm中的 Terminal 命令行 输入: pip install PyMySQL 注&#xff1a;通过pip安装&#xff0c;可能会提示需要更新pip&#xff0c;这时可执行&#…

could‘t get post build model module: xx.app.main variant:xxdebbug

当androidStudio进行run应用的时候,报错&#xff1a; couldt get post build model module: xx.app.main variant:xxdebbug后经过排查&#xff0c;方案如下&#xff1a; invalidate caches 清除缓存&#xff08;全部勾选&#xff09;&#xff1b; 删除 .gradle 目录&#xff…

【JS逆向学习】某壁纸下载(ast混淆)

逆向目标 目标网址&#xff1a;https://bz.zzzmh.cn/index逆向接口一&#xff1a;https://api.zzzmh.cn/bz/v3/getData逆向接口二&#xff1a;https://cdn2.zzzmh.cn/wallpaper/origin/0d7d8d691e644989b72ddda5f695aca2.jpg?response-content-dispositionattachment&aut…

eNSP学习——理解ARP及Proxy ARP

目录 名词解释 实验内容 实验目的 实验步骤 实验拓扑 配置过程 基础配置 配置静态ARP 名词解释 ARP (Address Resolution Protocol)是用来将IP地址解析为MAC地址的协议。ARP表项可以分为动态和静态两种类型。   动态ARP是利用ARP广播报文&#xff0c;动态执行并自动进…

RT-DETR 模型改进 | AKConv:具有任意采样形状和任意参数数量的卷积核

基于卷积操作的神经网络在深度学习领域取得了显著的成果,但标准卷积操作存在两个固有缺陷。一方面,卷积操作受限于局部窗口,无法捕捉其他位置的信息,而其采样形状是固定的。另一方面,卷积核的大小固定为kk,呈固定的正方形形状,而参数数量往往随大小呈平方增长。显然,不…

TensorRT英伟达官方示例解析(二)

系列文章目录 TensorRT英伟达官方示例解析&#xff08;一&#xff09; TensorRT英伟达官方示例解析&#xff08;二&#xff09; 文章目录 系列文章目录前言一、03-BuildEngineByTensorRTAPI1.1 建立 Logger&#xff08;日志记录器&#xff09;1.2 Builder 引擎构建器1.3 Netwo…

关于 LLM,你了解多少?

LLM定义 大语言模型&#xff08;LLM&#xff09;是一种基于大量文本数据训练的深度学习模型。它的主要功能是生成自然语言文本或理解语言文本的含义。这些模型可以处理多种自然语言任务&#xff0c;如文本分类、问答、对话等&#xff0c;是通向人工智能的一条重要途径。 LLM发…

什么是通配监听端口? 什么是通配监听IP?

什么是通配监听端口? 监听端口&#xff1a; 指的是服务器或服务开启的特定TCP或UDP端口号&#xff0c;等待客户端连接或发送数据。TCP/IP协议下每个端口只能由一个服务独占监听&#xff0c;一个服务或应用会指定监听特定的一个或多个端口来接收客户端的连接请求。 例如 Web…