MongoDB常用语句(CURD)
文章目录
- 一、数据库操作
- 二、集合操作
- 三、文档操作
- 3.1 插入文档
- 3.2 查询文档
- 3.3 更新文档
- 3.4 删除文档
- 四、安全认证
- 4.1 创建管理员账号
- 4.2 创建应用数据库用户
- 4.3 启动和连接 (校验方式)
提示:以下是本篇文章正文内容,MongoDB 系列学习将会持续更新
一、数据库操作
①查看数据库
show dbs
show databases
②查看当前正在使用的数据库 (默认的数据库为 test,如果你没有选择数据库,集合将存放在 test 数据库中)
db
③选择或创建数据库 (新建的数据库会暂时存放到内存中,所以无法用show查看,只有插入内容会才会持久化到磁盘中)
use 数据库名称
④删除数据库
db.dropDatabase()
⑤默认存在的数据库
- admin:从权限的角度来看,这是 “root” 数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local:这里的数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
- config:当 Mongo 用于分片设置时,config 数据库在内部使用,用于保存分片的相关信息。
二、集合操作
①查看集合
show collections
show tables
②显式创建集合
db.createCollection(集合名)
db.createCollection("books")
# 设置参数
db.createCollection(name, options)
固定集合 options 参数:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
③删除集合:结果会返回 true 或 false
db.collection.drop()
db.books.drop()
④查看集合详情
db.collection.stats()
回到目录…
三、文档操作
文档(document)的数据结构和 JSON 基本一样,所有存储在集合中的数据都是 BSON 格式。
3.1 插入文档
insert
:若插入的数据主键已经存在,则会抛 DuplicateKeyException 异常,提示主键重复,不保存当前数据。支持单行和多行插入save
:如果 _id 主键存在则更新数据,如果不存在就插入数据。支持单行和多行插入db.collection.insertOne()
:版本3.2新增,支持 writeConcern。仅支持单行插入db.collection.insertMany()
:版本3.2新增,支持 writeConcern。支持多行插入
writeConcern 决定一个写操作落到多少个节点上才算成功。它的取值包括:
0
:发起写操作,不关心是否成功。1
:默认的写入策略。集群最大数据节点数,写操作需要被复制到指定节点数才算成功。majority
:写操作需要被复制到大多数节点上才算成功。
①新增单个文档
db.collection.insertOne(<document>,{writeConcern: <document>}
)
db.user.insertOne({name:"zhangsan",password:"123",age:18})
②批量新增文档: ordered 指定是否按顺序写入,默认 true,按顺序写入。
db.collection.insertMany([ <document 1> , <document 2>, ... ],{writeConcern: <document>,ordered: <boolean>}
)
db.user.insertMany([{name:"lisi",password:"456",age:19},{name:"wangwu",password:"789",age:20},{name:"zhaoliu",password:"258",age:21}])
③执行脚本插入
编辑脚本 book.js
var tags = ["nosql","mongodb","document","developer","popular"];
var types = ["technology","sociality","travel","novel","literature"];
var books=[];
for(var i=0;i<50;i++){var typeIdx = Math.floor(Math.random()*types.length);var tagIdx = Math.floor(Math.random()*tags.length);var favCount = Math.floor(Math.random()*100);var book = {title: "book-"+i,type: types[typeIdx],tag: tags[tagIdx],favCount: favCount,author: "xxx"+i};books.push(book)
}
db.book.insertMany(books);
进入 MongoShell 中执行:pwd() 查看当前路径
load("../js/books.js")
回到目录…
3.2 查询文档
db.collection.find(query, projection)
db.collection.findOne(query, projection)
- query:可选,使用查询操作符指定查询条件。
- projection:可选,使用投影操作符指定返回的键。投影时,id为1的时候,其他字段必须是1;id是0的时候,其他字段可以是0;如果没有_id字段约束,多个其他字段必须同为0或同为1。
①指定文档查询
# 全列查询
db.book.find()// 指定列查询,(0表示不查、1表示查询), 默认_id:1
db.book.find({},{title:1,author:1})
// 仅查询 title 和 author 字段
db.book.find({},{_id:0,title:1,author:1})
②条件查询
// 查询标题为“book-2”的文档
db.book.find({title:"book-2"})// 查询分类为“travel” 且 收藏数超过60个的book文档
db.book.find({type:"travel",favCount:{$gt:60}})// 查询type为“travel” 或 tag为"nosql"的book文档
db.book.find({$or:[{type:"travel"},{tag:"nosql"}]})
示例:
逻辑运算符对照表:
逻辑运算符 | SQL | MQL |
---|---|---|
a = 1 | {a: 1} | |
$lt | a < 1 | {a: {$lt: 1}} |
$lte | a <= 1 | {a: {$lte: 1}} |
$gt | a > 1 | {a: {$gt: 1}} |
$gte | a >= 1 | {a: {$gte: 1}} |
$ne | a != 1 | {a: {$ne: 1}} |
$and | a = 1 and b = 1 | {a: 1, b: 1} 或 {$and: [{a: 1}, {b: 1}]} |
$in | a in (1, 2, 3) | {a: {$in: [1, 2, 3]}} |
$nin | a not in (1, 2, 3) | {a: {$nin: [1, 2, 3]}} |
$or | a = 1 or b = 1 | {$or: [{a: 1}, {b: 1}]} |
$regex | c 包含字符串 “abc” | {c: {$regex: “abc”}} |
③排序 & 分页
指定排序:使用 sort() 方法对数据进行排序。
// 指定按收藏数(favCount)降序返回
db.book.find().sort({favCount:-1})
分页查询:skip 用于指定跳过记录数,limit 则用于返回结果数量。
// 分页设计: 每页大小为8条的book文档
// 第一页
db.book.find().skip(0).limit(8)
// 第二页
db.book.find().skip(8).limit(8)
// 第三页
db.book.find().skip(16).limit(8)
④正则表达式匹配查询
// 查找type包含“so”字符串的book文档
db.book.find({type:{$regex:"so"}})
// 使用正则表达式
db.book.find({type:/so/})
回到目录…
3.3 更新文档
db.collection.update(query,update,options)
- query:描述更新的查询条件。
- update:描述更新的动作及新的内容。
- options:描述更新的选项。
upsert
: 可选,如果不存在 update 的记录,是否插入新的记录。默认 false,不插入。multi
: 可选,是否按条件查询出的多条记录全部更新。 默认 false,只更新找到的第一条记录。writeConcern
:可选,决定一个写操作落到多少个节点上才算成功。
操作符 | 格式 | 描述 |
---|---|---|
$set | {$set:{field:value}} | 指定一个键并更新值,若键不存在则创建 |
$unset | {$unset : {field : 1 }} | 删除一个键 |
$inc | {$inc : {field : value } } | 对数值类型进行增减 |
$rename | {$rename : {old_field_name : new_field_name } } | 修改字段名称 |
$push | { $push : {field : value } } | 将数值追加到数组中,若数组不存在则会进行初始化 |
$pushAll | {$pushAll : {field : value_array }} | 追加多个值到一个数组字段内 |
$pull | {$pull : {field : _value } } | 从数组中删除指定的元素 |
$addToSet | {$addToSet : {field : value } } | 添加元素到数组中,具有排重功能 |
$pop | {$pop : {field : 1 }} | 删除数组的第一个或最后一个元素 |
①更新单个文档
// 将book-0书籍的数量增加一本
db.book.update({title:"book-0"},{$inc:{favCount:1}})
②更新多个文档
// 将分类为“novel”的文档的增加发布时间(publishedDate)
db.book.update({type:"novel"},{$set:{publisherDate:new Date()}},{multi:true})
update 命令的选项配置较多,为了简化使用还可以使用一些快捷命令:
- updateOne:更新单个文档。
- updateMany:更新多个文档。
- replaceOne:替换单个文档。
③使用 upsert 命令: 如果目标文档不存在,则执行插入命令。
db.book.update({title:"myBook"},{$set:{tags:["nosql","mongodb"],type:"none",author:"fox"}},{upsert:true})
nMatched、nModified 都为0,表示没有文档被匹配及更新,nUpserted=1提示执行了upsert动作。
④实现 replace 语义: 如果更新描述中不包含任何操作符,就会实现 replace 替换。
db.book.update({title:"myBook"},{mytitle:"newBook"})
⑤findAndModify 命令
findAndModify 兼容了查询和修改指定文档的功能,findAndModify 只能更新单个文档。
// 将某个book文档的收藏数(favCount)加1
db.book.findAndModify({query:{title:"book-0"},update:{$inc:{favCount:1}}
})
该操作会返回修改前的 “旧” 数据,并完成对文档的修改。
// 可以指定 new 选项,返回修改后的 “新” 数据。
db.book.findAndModify({query:{title:"book-0"},update:{$inc:{favCount:1}},new:true
})
与 findAndModify 语义相近的命令如下:
- findOneAndUpdate:更新单个文档并返回更新前(或更新后)的文档。
- findOneAndReplace:替换单个文档并返回替换前(或替换后)的文档。
回到目录…
3.4 删除文档
①使用 remove 删除
- remove 命令需要配合查询条件使用;
- 匹配查询条件的文档会被删除;
- 指定一个空文档条件会删除所有文档;
db.book.remove({title:"book-5"}) //删除某个标题的书籍
db.book.remove({favCount:{$lt:30}}) //删除数量少于30的书籍
db.book.remove({}) //删除所有记录
db.book.remove() //报错
remove 命令会删除匹配条件的全部文档,如果希望明确限定只删除一个文档,则需要指定 justOne 参数,命令格式如下:
db.collection.remove(query,justOne)
// 示例: 删除满足type:novel条件的首条记录
db.book.remove({type:"novel"},true)
②使用 delete 删除 (官方推荐)
db.book.deleteMany({}) //删除集合下全部文档
db.book.deleteMany({type:"novel"}) //删除 type等于 novel 的全部文档
db.book.deleteOne({type:"travel"}) //删除 type等于 travel 的一个文档
③返回被删除文档
如果希望获得被删除的文档,可以使用 findOneAndDelete,但只能删除并返回第一条结果:
db.books.findOneAndDelete({type:"novel"})
除了在结果中返回删除文档,还允许定义“删除的顺序”,即按照指定顺序删除找到的第一个文档:
db.books.findOneAndDelete({type:"novel"},{sort:{favCount:1}})
回到目录…
四、安全认证
4.1 创建管理员账号
# 设置管理员用户名密码需要切换到admin库
use admin
# 创建管理员
db.createUser({user:"root",pwd:"123456",roles:["root"]})
# 查看所有用户信息
show users
# 删除用户
db.dropUser("root")
4.2 创建应用数据库用户
use library
db.createUser({user:"wsy",pwd:"123456",roles:["dbOwner"]})
常用角色权限:
权限名 | 描述 |
---|---|
read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
dbOwner | 允许用户在指定数据库中执行任意操作,增、删、改、查等 |
userAdmin | 允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 |
readAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 |
dbAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限 |
root | 只在admin数据库中可用。超级账号,超级权限 |
4.3 启动和连接 (校验方式)
①默认情况下,MongoDB 不会启用鉴权,以鉴权模式启动 MongoDB
mongod -f ../conf/mongod.conf --auth
②启用鉴权之后,连接 MongoDB 的相关操作都需要提供身份认证
mongo -u用户名 -p密码 --authenticationDatabase=用户所在库
mongo -uroot -p123456 --authenticationDatabase=admin
mongo -uwsy -p123456 --authenticationDatabase=library
管理员可以看到并操作所有数据库:
普通用户只能看到并操作对应的数据库:
回到目录…
总结:
提示:这里对文章进行总结:
本文是对MongoDB的学习,学习了针对数据库、集合、文档的增删查改操作,并且学习创建用户及权限、以安全认证的方式启动MongoDB。之后的学习内容将持续更新!!!
相关文章:

MongoDB常用语句(CURD)
文章目录 一、数据库操作二、集合操作三、文档操作3.1 插入文档3.2 查询文档3.3 更新文档3.4 删除文档 四、安全认证4.1 创建管理员账号4.2 创建应用数据库用户4.3 启动和连接 (校验方式) 提示:以下是本篇文章正文内容,MongoDB 系列学习将会持续更新 一…...

一篇文章让你彻底学会--节流(并且自己可以手写)
Hi,有的小伙伴们在面试的时候会被要求手写节流函数,很多都被难着了吧,宝贝,那你你没有理解节流函数。 今天,就让我带你攻克它! 1.节流 单位时间内,事件触发,最多只执行一次事件回调。 人话:说…...
C++ 形参是类的指针 class * 通过new的方式创建对象
当你在C中使用类指针(class *)作为函数的形参,并通过 new 关键字创建对象时,这种用法确实会改变类对象的值。原因是你通过指针传递了对象的内存地址,而不是传递对象本身。这意味着在函数内部对对象的任何修改都会直接影…...

手把手教你将项目部署到服务器!
一、导入centos7虚拟机: 打开VMWare,点击“打开虚拟机”,选择centos7.ova之后,选择存储路径: 点击导入: 选择“不再显示此消息”,点击“重试”按钮: 点击“编辑虚拟机设置”&#x…...

OpenHarmony应用开发-ArkUI方舟开发框架简析
方舟开发框架(简称ArkUI)为OpenHarmony应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界…...

【Transformer系列(4)】Transformer模型结构超详细解读
前言 前一篇我们一起读了Transformer的论文《Attention Is All You Need》,不知道大家是否真的理解这个传说中的神(反正俺是没有~) 这两天我又看了一些视频讲解,感谢各位大佬的解读,让我通透了不少。 这篇文章就和…...

Idea启动运行报错:Error:java: 无效的源发行版: 13
最近在做Springboot项目时,常常出现上述错误,小编也不知道怎么回事,到网上找了这个方面的解决办法,但是却发现根本解决不了,最终通过小编多次尝试,终于发现,为什么会报这个错误。(应该是Java版本…...
【元分析研究方法】学习笔记1.形成问题
步骤1 形成问题 该步骤的作用该步骤中需要注意的问题该步骤中部分知识点我的收获 参考来源:库珀 (Cooper, H. M. )., 李超平, & 张昱城. (2020). 元分析研究方法: A step-by step approach. 中国人民大学出版社. 这章内容很简单:①变量的刻画&#x…...
2023年3月 青少年软件编程(Python) 等级考试试卷(五级)
一、单选题(共25题,共50分) 1.已知一个列表lst [2,3,4,5,6],lst.append(20),print(lst)的结果是?(C)(2分) A.[10,2,3,4,5,6,20] B.[20,2,10,3,4,5,6] C.[2,3,4,5,6,20] D.[2,3,4,5,…...

必须要知道的hive调优知识(上)
Hive数据倾斜以及解决方案 1、什么是数据倾斜 数据倾斜主要表现在,map/reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其…...
什么是Cache Aside Pattern与延迟双删
Cache Aside Pattern是一种常用的缓存设计模式,用于在应用程序中使用缓存提高系统性能的同时,避免缓存与数据库数据不一致的情况出现。延迟双删是Cache Aside Pattern的一种优化,可以进一步提高系统性能。 以下是关于Cache Aside Pattern和延…...

frp 流量特征
frp 流量特征 非常明显的明文流量特征...

Unity --- UGUI(Unity Graphical user interface)--- Canvas画布
1.UI --- User Interface --- 使用者与机器之间的交互界面 1.所谓的自适应系统指的是分辨率的适应: 比如在一个分辨率下做的UI放到另一个分辨率下显示时,如果没有自适应系统的话就会导致UI过大,过小,被辟成一半等等情况ÿ…...

c++积累6-内联函数
1、说明 内联函数是c为提高程序运行速度所做的一项改进。 2、常规函数运行 编译的可执行程序:由一组机器语言指令组成。 程序执行: 1、操作系统将这些指令载入到内存,每条指令都有一个特定的内存地址 2、计算机逐步执行这些指令 3、如果有…...
ESP32学习笔记13-MCPWM主要用于无刷电机驱动
16.MCPWM 16.1概述 ESP32 有两个 MCPWM 单元,可用于控制不同类型的电机。每个单元都有三对PWM输出 每个 A/B 对可由三个定时器定时器 0、1 和 2 中的任何一个计时。 同一定时器可用于为多对PWM输出提供时钟。 每个单元还能够收集输入,例如,检测电机过电流或过电压,以及获得…...
MyBatis-plu 和 JPA 对比
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MyBatis-plu 和 JPA 前言一、说下相同点二、差异点一、从实现来说:CURD实现方式不一样二、分页上三、雪花id四、伪删除五、子类排除父类的字段 总结 前言 提示&…...
一文详解Python中多进程和进程池的使用方法
这篇文章将介绍Python中多进程和进程池的使用方法,并提供一些实用的案例供大家参考,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下 目录 Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。…...

前端部署发布项目后,如何通知用户刷新页面、清除缓存
以下只是一些思路,有更好的实现方式可以留言一起交流学习 方式一:纯前端 在每次发布前端时,使用webpack构建命令生成一个json文件,json中写个随机生成的一个字符串(比如时间戳),每次打包程序都…...

项目上线|慕尚集团携手盖雅工场,用数字化推动人效持续提升
过去十年,中国零售业以前所未有的速度被颠覆、被重塑,数字化则是其中重要的推动要素。 随着数字化转型的深入,零售企业的数字化不再局限于布局线上渠道,且更关乎其背后企业核心运营能力的全链路数字化改造。而贯穿于运营全链路的…...
Java重载 与封装、继承
方法重载 在同一个类中,出现了方法名相同,参数不同的方法时 ,我们叫方法重载 作用:根据不同参数,选择不同方法 实例 public static void main(String[] args){public int add(int a,int b){return ab;}public double…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...