MongoDB的常用语句

简介

MongoDB 是免费开源的跨平台 NoSQL 数据库,命名源于英文单词 humongous,意思是「巨大无比」,可见开发组对 MongoDB 的定位。与关系型数据库不同,MongoDB 的数据以类似于 JSON 格式的二进制文档存储:

{name: "Angeladady",age: 18,hobbies: ["Steam", "Guitar"]
}

文档型的数据存储方式有几个重要好处:文档的数据类型可以对应到语言的数据类型,如数组类型(Array)和对象类型(Object);文档可以嵌套,有时关系型数据库涉及几个表的操作,在 MongoDB 中一次就能完成,可以减少昂贵的连接花销;文档不对数据结构加以限制,不同的数据结构可以存储在同一张表。

MongoDB 的文档数据模型和索引系统能有效提升数据库性能;复制集功能提供数据冗余,自动化容灾容错,提升数据库可用性;分片技术能够分散单服务器的读写压力,提高并发能力,提升数据库的可拓展性。MongoDB 高性能,高可用性、可扩展性等特点,使其至 2009 年发布以来,逐渐被认可,并被越来越多的用于生产环境中。AWS、GCP、阿里云等云平台都提供了十分便捷的 MongoDB 云服务。

连接实例

通过 mongo 命令来连接 mongoDB 实例:

mongo [options] [db address] [file names]

之前启动实例的是在本地 12345 端口,安全模式未被开启,所以不需要输入用户名和密码即可直接连接:

mongo 127.0.0.1:12345

或者通过--host--port选项指定主机和端口。一切顺利的话,就进入了 mongoDB shell,shell 会报出一连串权限警告,不过不用担心,这并不会影响之后的操作。在添加授权用户和开启认证后,这些警告会自动消失。

数据库操作

# 查看所有数据库,也可以简写为show dbs
show databases# 选择数据库(如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建)
use 数据库名# 查看当前数据库名称
db# 删除数据库(先选中数据库),如果数据库不存在则什么也不做
db.dropDatabase()

集合操作

# 查看所有集合
show collections# 创建集合(插入数据会隐式创建)
db.createCollection('集合名')# 删除集合
db.集合名.drop()

数据类型

下表为MongoDB中常用的几种数据类型:

数据类型说明
Object ID文档ID。每个文档都有一个属性_id,保证每个文档的唯一性。可以自己去设置_id插入文档。如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为ObjectID。ObjectID是一个12字节的十六进制数,前4个字节为当前时间戳,接下来3个字节的机器ID,接下来的2个字节中MongoDB的服务进程id,最后3个字节是简单的增量值。
String字符串,最常用,必须是有效的UTF-8
Boolean存储一个布尔值,true或false
Integer整数可以是32位或64位,这取决于服务器
Double存储浮点值
Arrays数组或列表,多个值存储到一个键
Object用于嵌入式的文档,即一个值为一个文档
Null存储Null值
Timestamp时间戳
Date存储当前日期或时间的UNIX时间格式

CRUD 操作

在进行增查改删操作之前,先了解下常用的数据库和集合操作:

  • db 显示当前所在数据库,默认为 test
  • show dbs 列出可用数据库
  • show collections 列出数据库中可用集合
  • use <database> 用于切换数据库

mongoDB 预设有两个数据库,admin 和 local,admin 用来存放系统数据,local 用来存放该实例数据,在副本集中,一个实例的 local 数据库对于其它实例是不可见的。使用 use 命令切换数据库:

> use admin
> use local
> use newDatabase

可以 use 一个不存在的数据库,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建:

> use newDatabase
> db.newCollection.insert({x:1})
WriteResult({ "nInserted" : 1 })

以上命令向数据库中插入一个文档,返回 1 表示插入成功,mongoDB 自动创建 newCollection 集合和数据库 newDatabase。下面将创建一个 drivers 集合,进行增查改删操作。

创建(Insert)

MongoDB 提供 insert 方法创建新文档,db.集合名称.insert(document)。

插入文档时,可以指定_id参数,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId。

  • db.collection.inserOne() 插入单个文档
    WriteResult({ “nInserted” : 1 })
  • db.collection.inserMany() 插入多个文档
  • db.collection.insert() 插入单条或多条文档

这里以 insert 方法为例:

> db.drivers.insert({name:"Chen1fa",age:18})
> db.drivers.insert({name:"Xiaose",age:35})
> db.drivers.insert({_id:91,name:"Sun1feng",age:34})

要注意,age:18age:"18"是不一样的,前者插入的是数值,后者插入的是字符串。插入新文档如果未指定 _id,mongoDB 会自动为插入的文档添加 _id 字段。使用 db.dirvers.find() 命令即可看到刚刚插入的文档:

> db.dirvers.find()
{ "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 18 }
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }
{ "_id" : 91, "name" : "Sun1feng", "age" : 34 }

查找(Find)

db.集合名.find(条件 [,查询的列])
db.集合名.find(条件 [,查询的列]).pretty()	#格式化查看# 条件
- 查询所有数据	{}或不写
- 查询指定要求数据	{key:value}或{key:{运算符:value}}# 查询的列(可选参数)
- 不写则查询全部列
- {key:1}	只显示key列
- {key:0}	除了key列都显示
- 注意:_id列都会存在
运算符作用
$gt大于
$gte大于等于
$lt小于
$lte小于等于
$ne不等于
$inin
$ninnot in

MongoDB 提供 find 方法查找文档,可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。

语法格式如下:

>db.col.find({key1:value1, key2:value2}).pretty()

pretty()可选,表示将结果格式化。

第一个参数为查询条件:

> db.drivers.find() #查找所有文档
{ "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 18 }
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }
{ "_id" : 91, "name" : "Sun1feng", "age" : 34 }> db.drivers.find({name: "Xiaose"}) #查找 name 为 Xiaose 的文档
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }> db.drivers.find({age:{$gt:20}}) #查找 age 大于 20 的文档
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }
{ "_id" : 91, "name" : "Sun1feng", "age" : 34 }

上述代码中的$gt对应于大于号>的转义。

第二个参数可以传入投影。文档映射数据:

> db.drivers.find({age:{$gt:20}},{name:1})
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose" }
{ "_id" : 91, "name" : "Sun1feng" }

上述命令将查找 age 大于 20 的文档,返回 name 字段,排除其它字段。投影文档中字段为 1 或真值表示包含,0 或假值表示排除,可以设置多个字段为 1 或 0,但不能混合使用。

除此之外,还可以通过 count、skip、limit 等指针(Cursor)方法,改变文档查询的执行方式:

> db.drivers.find().count() #统计查询文档数目
3
> db.drivers.find().skip(1).limit(10).sort({age:1})
{ "_id" : 91, "name" : "Sun1feng", "age" : 34 }
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }

上述查找命令跳过 1 个文档,限制输出 10 个,以 name 子段正序排序(大于 0 为正序,小于 0 位反序)输出结果。最后,可以使用 Cursor 方法中的 pretty 方法,提升查询文档的易读性,特别是在查看嵌套的文档和配置文件的时候:

> db.drivers.find().pretty()

更新(Update)

MongoDB 提供 updata 方法更新文档:

  • db.collection.updateOne() 更新最多一个符合条件的文档
  • db.collection.updateMany() 更新所有符合条件的文档
  • db.collection.replaceOne() 替代最多一个符合条件的文档
  • db.collection.update() 默认更新一个文档,可配置 multi 参数,更新多个文档

以 update() 方法为例。其格式:

> db.collection.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>}
)

各参数意义:

  • query 为查询条件,类似sql语句update中where部分

  • update 更新操作符,类似sql语句update中set部分。默认是对原数据进行替换,若要进行修改,格式为 {修改器:{key:value}}

    修改器作用
    $inc递增
    $rename重命名列
    $set修改列值
    $unset删除列
  • upsert 可选,默认是false,表示查询为空时什么也不做,值为true表示查询为空时插入文档

  • multi 可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新

下面的命令将 name 字段为 Chen1fa 的文档,更新 age 字段为 30:

> db.drivers.update({name:"Chen1fa"},{name:"Chen1fa", age:30})

要注意的是,如果更新文档只传入 age 字段,那么文档会被更新为{age: 30},而不是{name:"Chen1fa", age:30}。**要避免文档被覆盖,需要用到 s e t 指令 ∗ ∗ , set 指令**, set指令set 仅替换或添加指定字段:

> db.drivers.update({name:"Chen1fa"},{$set:{age:30}})

如果要在查询的文档不存在的时候插入文档,要把 upsert 参数设置真值:

> db.drivers.update({name:"Alen"},{age:24},{upsert: true})

update 方法默认情况只更新一个文档,如果要更新符合条件的所有文档,要把 multi 设为真值,并使用 $set 指令:

> db.drivers.update({age:{$gt:25}},{$set:{license:'A'}},{multi: true})
> db.drivers.update({age:{$lt:25}},{$set:{license:'C'}},{multi: true})

最终结果:

> db.dirvers.find()
{ "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 30, "license" : "A" }
{ "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35, "license" : "A" }
{ "_id" : 91, "name" : "Sun1feng", "age" : 34, "license" : "A" }
{ "_id" : ObjectId("598968b3ed1eccef17e79abe"), "age" : 24, "license" : "C" }

删除(Delete)

MongoDB 提供了 delete 方法删除文档:

  • db.collection.deleteOne() 删除最多一个符合条件的文档
  • db.collection.deleteMany() 删除所有符合条件的文档
  • db.collection.remove() 删除一个或多个文档

以 remove 方法为例:

> db.drivers.remove({name:"Xiaose"}) #删除所有 name 为 Xiaose 的文档
> db.drivers.remove({age:{$gt:30}},{justOne:true}) #删除第一条 age 大于 30 的文档
> db.drivers.find()
{ "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 30, "license" : "A" }
{ "_id" : ObjectId("598968b3ed1eccef17e79abe"), "age" : 24, "license" : "C" }

MongoDB 提供了 drop 方法删除集合,返回 true 表示删除集合成功:

> db.drivers.drop() 

排序(Sort)

db.集合名.find().sort(json数据)# json数据(key:value)
- key就是要排序的字段
- value为1表示升序,-1表示降序

分页(Skip、Limit)

db.集合名.find().sort().skip(数字).limit(数字)[.count()]# skip(数字)
- 指定跳过的数量(可选)# limit(数字)
- 限制查询的数量# count()
- 统计数量

后话

相比传统关系型数据库,MongoDB 的 CURD 操作更像是编写程序,更符合开发人员的直觉,不过 MongoDB 同样也支持 SQL 语言。MongoDB 的 CURD 引擎配合索引技术、数据聚合技术和 JavaScript 引擎,赋予 MongoDB 用户更强大的操纵数据的能力。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql视图介绍(本质,修改数据时的表现,排序覆盖)

目录 视图 介绍 语法 使用 本质 修改数据 排序覆盖 视图 介绍 是一种虚拟表&#xff0c;它不存储实际的数据&#xff0c;而是基于查询结果动态生成数据 将查询结果以表结构保存视图和基表之间会互相影响 视图可以基于一张或多张表来创建&#xff0c;并且可以像普通表一样…

List、Set、数据结构、Collections

一、数据结构 1.1 常用的数据结构 栈 栈&#xff1a;stack,又称堆栈&#xff0c;它是运算受限的线性表&#xff0c;其限制是仅允许在标的一端进行插入和删除操作&#xff0c;不允许在其他任何位置进行添加、查找、删除等操作。 简单的说&#xff1a;采用该结构的集合&#…

Clickhouse笔记(二) 集群搭建

0.集群规划 操作系统使用ubuntu2204server&#xff0c;8C8G100G。 节点分片部署192.168.50.5分片1副本1clickhouse-server/clickhouse-client/keeper192.168.50.6分片1副本2clickhouse-server/clickhouse-client/keeper192.168.60.7分片2副本1clickhouse-server/clickhouse-c…

ECharts饼图-饼图纹理,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个饼图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供详…

day7:软件包管理

一&#xff0c;软件包概述 软件包概述 软件包用于安装&#xff0c;升级&#xff0c;卸载一个软件 软件包类型 二进制包 源码经过了编译&#xff08;而且成功了&#xff09;后产生的包&#xff0c;二进制包是linux下默认的安装包 编译好的文件&#xff0c;直接使用&#xff…

音质最好的麦克风有哪些?领夹麦克风哪个品牌好?麦克风十大品牌

在当下自媒体行业蓬勃发展的背景下&#xff0c;无线领夹麦克风已成为众多内容创作者不可或缺的装备。市场上的无线领夹麦克风种类繁多&#xff0c;品质参差不齐&#xff0c;价格也相差悬殊&#xff0c;这使得选购一款合适的麦克风变得颇具挑战性。许多消费者在追求性价比的过程…

无人机避障——路径规划篇(一) JPS跳点搜索算法A*算法对比

JSP 跳点搜索算法与改进 A*算法对比 一、算法概述: 跳点搜索(Jump Point Search,JPS)算法:一种用于路径规划的启发式搜索算法。它主要用于在网格地图(如游戏地图、机器人运动规划地图等)中快速找到从起点到终点的最短路径。该算法在改进 A*算法的基础上进行了优化,通过跳过一…

自由学习记录(12)

综合实践 2D的Shape&#xff0c;Tilemap都要导包的&#xff0c;编辑器也要导包&#xff0c;。。和2d沾边的可能3d都要主动导包 应该综合的去运用&#xff0c;不见得Tilemap就很万能&#xff0c;如果要做什么顶方块的有交互反应的物体&#xff0c; 那直接拖Sprite会更方便一些…

大路灯护眼灯是智商税吗?五款口碑最好的落地灯品牌分享

大路灯护眼灯是智商税吗?在当前照明灯具中&#xff0c;护眼灯大路灯并不是智商税&#xff01;护眼大路灯因其出色的灯光和舒适度效果而受到广泛欢迎。面对市场众多的护眼大路灯产品&#xff0c;选择一把优质的护眼大路灯显得尤为重要。低质量的护眼大路灯不仅性能不佳&#xf…

探索音频在线剪辑工具的奇妙世界

无论是专业的音频制作人&#xff0c;还是普通的音乐爱好者&#xff0c;都可能需要对音频进行剪辑和编辑。我比较建议从低成本的工具开始入手避免浪费&#xff0c;今天我推荐几款音频在线剪辑工具一起看看这些共苦如何打造作品吧。 1.福昕音频剪辑 教程链接&#xff1a;https:…

初学者如何学习网络安全,零基础入门到精通,收藏这一篇就够了

学习任何技术或知识前&#xff0c;需要培养好的学习习惯&#xff0c;投入时间和精力去进行钻研&#xff0c;培养兴趣和学习能力&#xff0c;并能通过搜索引擎解决问题。对于网络安全学习来说&#xff0c;要掌握学习方法&#xff0c;因为它的知识面广且复杂。 之前看到一张&quo…

初始JavaEE篇——多线程(2):join的用法、线程安全问题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 模拟实现线程中断 join的用法 线程的状态 NEW&#xff1a; RUNNABLE&#xff1a; TIMED_WAITING&#xff1a; TERMINATED…

苍穹外卖--开发记录day11

目录 苍穹外卖day11一&#xff1a;apache-Echarts简单了解二&#xff1a;营业额统计四&#xff1a;用户统计五&#xff1a;订单统计六&#xff1a;销量排名统计 总结 苍穹外卖day11 一&#xff1a;apache-Echarts简单了解 二&#xff1a;营业额统计 外链图片转存失败,源站可能…

深入解析C++游戏开发:从基础到高级应用

目录 深入解析C游戏开发&#xff1a;从基础到高级应用 目录 为何选择C进行游戏开发 高性能与高效率 强大的内存管理 广泛的库和框架支持 丰富的社区资源 C游戏开发基础 C基础知识 面向对象编程 常用设计模式 游戏开发流程 设计与规划 选择引擎和工具 架构设计 …

Data+AI━━隐私都没了,还不懂用户画像吗?

DataAI━━隐私都没了&#xff0c;还不懂用户画像吗&#xff1f; 前言用户画像是什么&#xff1f;用户画像的应用场景DataAI下如何构建用户画像 前言 数据驱动的时代&#xff0c;用户画像已经成为商业和技术领域的热门话题。无论你在电商、金融、广告还是社交媒体&#xff0c;…

从零开始学python必看,最强“Python编程三剑客(pdf)”

目录 三剑客PDF传送门&#xff1a;三剑客 第一本&#xff1a;《Python编程&#xff1a;从入门到实践》 1.1《Python编程&#xff1a;从入门到实践》第一部分&#xff1a;基础知识 1.2《Python编程&#xff1a;从入门到实践》第二部分&#xff1a;项目 第二本&#xff1a;《…

css模糊遮罩效果

原图&#xff1a; 模糊后的图片&#xff1a; html: <div class"bj"><div class"mengban"></div> </div> css: .bj {width: 750rpx;height: 643rpx;background-image:url(https://onlinekc.a.hlidc.cn/uploads/20241023/9e552fc…

大话网络协议:HTTPS协议和HTTP协议有何不同?为什么HTTPS更安全

大家现在访问网络,浏览网页,注意一下的话,网址前面基本上都是一个 https:// 的前缀,这里就是说明这个网址所采用的协议是 https 协议。那么具体应该怎么理解 https 呢? 本文我们就力争能清楚地解释明白这个我们目前应该最广的协议。 理解HTTP协议 要解释 https 协议,当…

FPGA采集adc,IP核用法,AD驱动(上半部分)

未完结&#xff0c;明天补全 IP核&#xff1a;集成的一个现有的模块 串口写好后基本不会再修改串口模块内部的一些逻辑&#xff0c;将串口.v文件添加进来&#xff0c;之后通过他的上层的接口去对他进行使用&#xff0c;所以我们打包IP&#xff0c;之后就不用去添加源文件了&a…

无人机和鸟数据集,无人机数据集+鸟数据集 yolo格式,可以直接用于模型的训练。7000张,图片自己打的标签 yolov5-yolov10通用

无人机和鸟数据集&#xff0c;无人机数据集鸟数据集 yolo格式&#xff0c;可以直接用于模型的训练。7000张&#xff0c;图片自己打的标签 yolov5-yolov10通用 无人机及鸟类目标检测数据集规模&#xff1a; 总图像数量&#xff1a;约7,000张类别&#xff1a;2类检测目标 Drone&…