MongoDB相关基础操作(库、集合、文档)
文章目录
- 一、库的相关操作
- 1、查看数据库
- 2、查看当前库
- 3、创建数据库
- 4、删除数据库
- 二、集合的相关操作
- 1、查看库中所有集合
- 2、创建集合
- 2.1、显示创建
- 2.2、隐式创建
- 3、删除集合
- 三、文档的相关操作
- 1、插入文档
- 1.1、插入单条文档
- 1.2、插入多条文档
- 1.3、脚本方式
- 2、查询文档
- 3、删除文档
- 4、更新文档
- 5、查询文档
- 5.1、语法
- 5.2、对比语法
- 5.3、AND
- 5.4、OR
- 5.5、AND 和 OR 联合
- 5.6、数组中查询
- 5.7、模糊查询
- 5.8、排序
- 5.9、分页
- 5.10、总条数
- 5.11、去重
- 5.12、指定返回字段
- 总结
一、库的相关操作
1、查看数据库
查看所有数据库有两种命令:
show databases
或
show dbs

2、查看当前库
最新版的MongoDB在>的左边已经显示当前的数据库名称了。
db

3、创建数据库
use命令是创建并使用(如果数据库已经有了则是切换数据库)
use gedeshidai
注意:
MongoDB有一种机制:当数据库中没有数据的时候,命令show dbs不会显示
当输入db的时候,会显示创建的数据(db命令是显示当前使用的数据库)
但是当我们在新建的数据库中插入一条数据后,就能显示出来了。
db.users.insert({name:'gedeshidai'});

注意:
- admin:从权限的角度来看,这是" root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
- conlig :当Mongo用于分片设置时, config数据库在内部使用,用于保存分片的相关信息。
4、删除数据库
默认删除当前数据库
db.dropDatabase()

虽然已经删除数据库gedeshidai,但是我们当前仍在gedeshidai数据库里面,这点需要注意。这是MongoDB的机制。

二、集合的相关操作
1、查看库中所有集合
show collections
或
show tables

2、创建集合
2.1、显示创建
db.createCollection('集合名称',[options])
options可以是如下参数(可选):
| 字段 | 类型 | 描述 |
|---|---|---|
| capped | 布尔 | (可选)如果为true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为true时,必须指定size参数。 |
| size | 数值 | (可选)为固定集合指定一个最大值,即字节数。如果capped为true,也需要指定该字段。 |
| max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |

2.2、隐式创建
注意:当集合不存在时,向集合中插入文档也会自动创建该集合。

3、删除集合
db.集合名称.drop();

三、文档的相关操作
官网地址:https://www.mongodb.com/docs/manual/crud/
1、插入文档
1.1、插入单条文档
db.集合名称.insert(document)-- 举例:
db.users.insert({"name":"哥的时代","age":21,"bir":"2023-11-19"});-- db.集合名称.insertOne():向指定集合中插入一条文档数据【推荐使用】
db.users.insertOne({"name":"哥的时代","age":21,"bir":"2023-11-19"});
1.2、插入多条文档
db.collection.insertMany():向指定集合中插入多条文档数据【推荐使用】
db.集合名称.insertMany([ <document 1> , <document 2>, ... ],{writeConcern: 1,//写入策略,默认为1,即要求确认写操作,0是不要求。ordered: true //指定是否按顺序写入,默认true,按顺序写入。})-- 举例:
db.users.insert([{"name":"哥的时代","age":21,"bir":"2023-11-19"},{"name":"小黑","age":22,"bir":"2023-11-19"}]);或
db.users.insertMany([{"name":"哥的时代","age":21,"bir":"2023-11-19"},{"name":"小黑","age":22,"bir":"2023-11-19"}
]);
1.3、脚本方式
for(let i=0;i<100;i++){db.users.insert({"_id":i,"name":"哥的时代_"+i,"age":21});}-- 1、先创建数组-- 2、将数据放在数组中-- 3、一次 insert 到集合中var arr = [];for(var i=1 ; i<=20000 ; i++){arr.push({num:i});}db.numbers.insert(arr);
注意:在mongodb中每个文档都会有一个_id作为唯一标识,_id默认会自动生成,如果手动指定将使用手动指定的值作为_id 的值。
2、查询文档
db.集合名称.find();
3、删除文档
db.集合名称.remove(<query>,{justOne: <boolean>,writeConcern: <document>})-- 由于remove()方法已经过时了,现在官方推荐使用deleteOne()和deleteMany()方法。
db.集合名称.deleteMany({query}) -- 不指定条件时删除集合下全部文档
db.users.deleteMany({});
db.users.deleteMany({age:21});
db.集合名称.deleteOne({query}) -- 删除一条文档
db.users.deleteOne({_id:ObjectId("65586ebacd3d67eac1aec0d4")});
参数说明:
-
query :可选删除的文档的条件。
-
justOne : 可选如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
-
writeConcern :可选抛出异常的级别。
注意:文档内容全部删除后,文档仍存在,即删除内容,不删除结构。
4、更新文档
db.集合名称.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>,writeConcern: <document>});
参数说明:
-
query : update的查询条件,类似sql update查询内where后面的。
-
update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
-
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
-
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
-
writeConcern :可选,抛出异常的级别。
-
WriteConcern.NONE:没有异常抛出
-
WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
-
WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
-
WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
-
WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
-
WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
-
WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。
-
- db.集合名称.update({“name”:“zhangsan”},{name:“11”,bir:new date()})
这个更新是将符合条件的全部更新成后面的文档,相当于先删除在更新- db.集合名称.update({“name”:“xiaohei”},{$set:{name:“mingming”}})
保留原来数据更新,但是只更新符合条件的第一条数据- db.集合名称.update({name:”小黑”},{$set:{name:”小明”}},{multi:true})
保留原来数据更新,更新符合条件的所有数据- db.集合名称.update({name:”小黑”},{$set:{name:”小明”}},{multi:true,upsert:true})
`保留原来数据更新,更新符合条件的所有数据,没有条件符合时插入数据
注意:在7.x版本的时候update()方法已经不适用了,官网提供了以下方法进行操作:
db.collection.updateOne()
最多更新与指定筛选器匹配的单个文档 即使多个文档可能与指定的筛选器匹配。db.collection.updateMany()
更新与指定筛选器匹配的所有文档。db.collection.replaceOne()
最多替换与指定筛选器匹配的单个文档 即使多个文档可能与指定的筛选器匹配。
5、查询文档
MongoDB查询文档使用find()方法。find()方法以非结构化的方式来显示所有文档。
5.1、语法
db.集合名称.find(query, projection)
-
query :可选,使用查询操作符指定查询条件
-
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.集合名称.find().pretty()
注意: pretty()方法以格式化的方式来显示所有文档。
5.2、对比语法
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
| 操作 | 格式 | 范例 | RDBMS中的类似语句 |
|---|---|---|---|
| 等于 | {:} | db.col.find({“by”:“哥的时代”}).pretty() | where by = ‘哥的时代’ |
| 小于 | {:{$lt:}} | db.col.find({“likes”:{$lt:50}}).pretty() | where likes < 50 |
| 小于或等于 | {:{$lte:}} | db.col.find({“likes”:{$lte:50}}).pretty() | where likes <= 50 |
| 大于 | {:{$gt:}} | db.col.find({“likes”:{$gt:50}}).pretty() | where likes > 50 |
| 大于或等于 | {:{$gte:}} | db.col.find({“likes”:{$gte:50}}).pretty() | where likes >= 50 |
| 不等于 | {:{$ne:}} | db.col.find({“likes”:{$ne:50}}).pretty() | where likes != 50 |
5.3、AND
db.集合名称.find({key1:value1, key2:value2,...}).pretty()
类似于 WHERE 语句:WHERE key1=value1 AND key2=value2
-
db.users.find({“age”:27,“name”:“哥的时代”,_id:8});
-
db.users.find({“age”:3,“age”:32});同一字段多次出现查询条件时,只有最后的查询条件才生效,即后面会覆盖前面的查询条件
5.4、OR
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
db.集合名称.find({$or: [{key1: value1}, {key2:value2}]}).pretty()
类似于 WHERE 语句:WHERE key1=value1 or key2=value2
- db.users.find({$or:[{_id:4},{age:18}]});
5.5、AND 和 OR 联合
类似SQL语句为:‘where age >25 AND (name = ‘哥的时代’ OR name = ‘MongoDB’)’
db.集合名称.find({"age": {$gt:25}, $or: [{"name": "哥的时代"},{"name": "MongoDB"}]}).pretty();
- db.users.find({age:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:15}̲,or:[{_id:3},{age:15}]});
5.6、数组中查询
-- 测试数据
db.集合名称.insert({ "_id" : 11, "age" : 29, "likes" : [ "看电视", "读书xx", "美女" ], "name" : "哥的时代_xx_11" })-- 执行数组查询> db.users.find({likes:"看电视"})-- $size 按照数组长度查询> db.users.find({likes:{$size:3}});
5.7、模糊查询
类似 SQL 中为 ‘where name like ‘%name%’’
db.users.find({likes:/哥/});
注意:在 mongoDB 中使用正则表达式可以是实现近似模糊查询功能
5.8、排序
db.集合名称.find().sort({name:1,age:1})
- 1 升序 -1 降序
类似 SQL 语句为: ‘order by name,age’
5.9、分页
db.集合名称.find().sort({条件}).skip(start).limit(rows);
类似于 SQL 语句为: ‘limit start,rows’
5.10、总条数
db.集合名称.count();
db.集合名称.find({"name":"哥的时代"}).count();
类似于 SQL 语句为: ‘select count(id) from …’
DeprecationWarning: Collection.count() is deprecated. Use countDocuments or estimatedDocumentCount.
-
db.users.countDocuments();
-
db.users.estimatedDocumentCount();
5.11、去重
db.集合名称.distinct('字段')
类似于 SQL 语句为: ‘select distinct name from …’
- db.users.distinct(“age”);
5.12、指定返回字段
db.集合名称.find({条件},{name:1,age:1})
- 参数2: 1 返回 0 不返回
-
db.users.find({},{“name”:1});查询所有,返回指定字段
-
db.users.find({age:{$lt:17}},{name:1});按照指定条件查询,返回指定字段
-
db.users.find({age:{$lt:17}},{_id:0,name:1});按照指定条件查询,返回指定字段,不返回id,注意id是唯一索引
总结
以上就是MongoDB相关基础操作(库、集合、文档)的知识点,希望对你有所帮助。
相关文章:
MongoDB相关基础操作(库、集合、文档)
文章目录 一、库的相关操作1、查看数据库2、查看当前库3、创建数据库4、删除数据库 二、集合的相关操作1、查看库中所有集合2、创建集合2.1、显示创建2.2、隐式创建 3、删除集合 三、文档的相关操作1、插入文档1.1、插入单条文档1.2、插入多条文档1.3、脚本方式 2、查询文档3、…...
进程和线程( Process and Thread)
目录 一、操作系统(Operating System) 操作系统的定位 二、 什么是进程/任务(Process/Task) 1.进程控制块抽象(PCB Process Control Block) 2.PCB中重要的属性 3.并发编程 三、线程(Thread) 1. 线程是…...
linux apache安装及虚拟主机配置
centos 安装apache, yum install httpd 将httpd.conf中的ServerName 前面的 # 去掉。 apache 2.2 的虚拟机的配置放置在conf/extra/httpd-vhosts.conf 中 apache 虚拟主机设置 a2enmod rewrite sudo vim 000-default 修改 ServerName *:80 <VirtualHost *…...
基于Spring Boot 框架的试卷自动生成系统的设计与实现
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题,今天给大家介绍…...
开发《猫咪攻略》小游戏的意义
开发《猫咪攻略》小游戏的意义有以下几点: 学习和掌握游戏开发的基本技能:通过开发《猫咪攻略》小游戏,可以学习和掌握游戏开发的基本技能,包括游戏策划、游戏设计、游戏编程和游戏测试等方面的技能。增强对猫咪的了解和认识&…...
hadoop、hive、DBeaver的环境搭建及使用
本文主要介绍hadoop、hive的结构及使用,具体的操作步骤见最后的附件; hadoop提供大数据的存储、资源调度、计算,分为三个模块:HDFS、YRAN、MapReduce HDFS提供数据的分布式存储,分为三个节点NameNode,DataNode,Second…...
Linux上通过SSL/TLS和start tls连接到LDAP服务器(附C++代码实现认证流程)
一,大致流程。 1.首先在Linux上搭建一个LDAP服务器 2.在LDAP服务器上安装CA证书,服务器证书,因为SSL/TLS,start tls都属于机密通信,需要客户端和服务器都存在一个相同的证书认证双方的身份。3.安装phpldapadmin工具&am…...
HarmonyOS ArkTS List组件和Grid组件的使用(五)
简介 ArkUI提供了List组件和Grid组件,开发者使用List和Grid组件能够很轻松的完成一些列表页面。常见的列表有线性列表(List列表)和网格布局(Grid列表): List组件的使用 List是很常用的滚动类容器组件&…...
考研思想政治理论大纲
一:马克思主义基本原理概论 (一)马克思主义是关于无产阶级和人类解放的科学 1、马克思主义的创立和发展 马克思主义的含义。马克思主义产生的经济社会根源、实践基础和思想渊源、马克思主义的创立、马克思主义在实践中的发展 2、马克思主义的鲜明特征 马克思主义科学性和革命…...
日期格式转化成星期几部署到linux显示英文
异常收集 原因:解决办法仰天大笑出门去,我辈岂是蓬蒿人 传入一个时间获取这个时间对应的是星期几,在开发环境(window系统)中显示为星期几,部署到服务器(linux系统)中会显示英文的时间…...
一个关于proto 文件的经验分享 :gRPC 跨语言双端通信显示错误码:12 UNIMPLEMENTED (附赠gRPC错误码表)
错误现象描述: 在使用c的客户端向golang的服务端发送远程调用时,显示: /home/zry/gRPC/grpc-v1.45.2/examples/cpp/DeviceData/greeter_client.cc83 12: unknown service DeviceData.DeviceDataService Greeter 接收到: RPC 失败这里的unkn…...
腾讯极光盒子A4021增强版_线刷官方
1、用USB_Burning_Tool线刷提供的线刷包,所需资料地址在最后 1)打开USB_Burning_Tool,选择资料里的A4021_line_flash_root.img(文件夹最好没有中文字符和空格),然后点击【开始】。 2)盒子准备好双USB线和电源。在1秒内先插入电源,再插入usb口。等这个软件识别到盒子,…...
机器学习第11天:降维
文章目录 机器学习专栏 主要思想 主流方法 投影 二维投射到一维 三维投射到二维 流形学习 PCA主成分分析 介绍 代码 内核PCA 具体代码 LLE 结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 主要思想 介绍:当一个任务有很多特征时,我们…...
异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (三)
内容提要: 如果说,爬取网页数据的时候,我们使用了异步,那么将数据放入redis里面,其实也需要进行异步;当然,如果使用多线程或者redis线程池技术也是可以的,但那会造成冗余; 因此,在测试完多线程redis搭配异步爬虫的时候,我发现效率直接在redis这里被无限拉低下来! 因此: 最终的r…...
VSCode新建Vue项目
前言 Vue.js 是一款流行的 JavaScript 前端框架,它可以帮助开发者轻松构建高性能、可扩展的 Web 应用程序。而 VSCode 则是一款功能强大的开源代码编辑器,它提供了许多有用的工具和插件,可以大幅提高开发效率。 在本文中,我们将…...
前端学习--React(1)
一、React简介 React由Meta公司研发,是一个用于 构建Web和原生交互界面的库 优势:组件化开发、不错的性能、丰富生态(所有框架中最好)、跨平台(web、ios、安卓) 开发环境搭建 打开相应文件夹 新建终端并…...
HarmonyOS从基础到实战-高性能华为在线答题元服务
最近看到美团、新浪、去哪儿多家互联网企业启动鸿蒙原生应用开发,这个HarmonyOS NEXT越来越引人关注。奈何当前不面向个人开发者开放,但是我们可以尝试下鸿蒙新的应用形态——元服务的开发。 元服务是基于HarmonyOS提供的一种面向未来的服务提供方式&…...
OpenCV快速入门:窗口交互
文章目录 前言一、鼠标操作1.1 鼠标操作简介1.2 鼠标事件类型(event类型)1.3 鼠标事件标志(flags)1.4 代码示例1.4.1 获取鼠标坐标位置1.4.2 监听鼠标滚轮事件1.4.3 在图像中显示鼠标坐标 二、键盘操作2.1 代码示例2.2 waitKey的等…...
数据智能引擎:企业模糊搜索API精准获取企业列表信息
引言 随着信息时代的迅速发展,数据变得愈加庞大和复杂。在这个大数据的时代,企业面临着海量信息的管理和利用挑战。为了更有效地获取并利用数据,企业信息模糊搜索API成为了企业数据智能引擎的一部分,为企业提供了精准的企业列表检…...
汇编-间接寻址(处理数组)
直接寻址很少用于数组处理,因为用常数偏移量来寻址多个数组元素时,直接寻址并不实用。取而代之的是使用寄存器作为指针(称为间接寻址(indirect addressing) ) 并控制该寄存器的值。如果一个操作数使用的是间接寻址, 就称之为间接操作数(indie…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
