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…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
