MongoDb学习笔记
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
https://www.runoob.com/python3/python-mongodb.html
1.下载安装
Windows直接去官网点击下载。或者下载我分享的安装包
https://www.mongodb.com/try/download/community
双击安装包进行安装




为了方便启动,我们将bin目录放在系统环境变量中,这样无论在任何目录启动Bash或者cmd都可以直接使用mongo命令。

MongoDB 默认将
数据库文件存储在安装路径下的data目录下,日志默认存放在log目录下。

为了避免文件混乱。我们一般在安装目录下新建一个db目录存放数据库,然后修改配置文件指向此路径。(不想改数据库目录的话这一步不做也行)


注意:我们安装的时候勾选了注册为服务,只有注册了服务才能用net start mongodb的方式启动,否则只能在命令行启动mongod -dbpath "D:\MongoDb\data\db"可以跟很多启动参数。安装时也可以不勾选,然后手动注册服务,命令如下所示。
启动Mongodb服务(不区分大小写)。
启动服务之后就能使用
mongo命令进入数据库了,默认已经建了个表test。(我们上一步已经将bin目录添加到系统变量了,所以可以直接使用)

如果我们希望操作起来更简单,就需要安装可视化界面。
https://www.mongodb.com/try/download/compass
下载后任意路径解压双击
MongoDBCompass即可使用。当然也可以下载安装版本。

net start mongodb启动数据库后,点击fill in connection填写网址端口connect即可连接。



2. 概念、数据类型

MongoDB支持以下数据类型:
String(字符串) : mongodb中的字符串是UTF-8有效的。
Integer (整数 ): 存储数值。整数可以是32位或64位,具体取决于您的服务器。
Boolean(布尔) _: 存储布尔(true/false)值。 _
Double(双精度 _): 存储浮点值。 _
Min/ Max keys(最小/最大键 _): 将值与最低和最高BSON元素进行比较。 _
Arrays(数组 _): 将数组或列表或多个值存储到一个键中。 _
Timestamp(时间戳 _): 存储时间戳。 _
Object (对象 ): 嵌入式文档。 _
Null (空值) : 存储Null值。
Symbol(符号 ): 与字符串相同,用于具有特定符号类型的语言。
Date(日期 ): 以UNIX时间格式存储当前日期或时间。
Object ID(对象ID ) : 存储文档ID。
Binary data(二进制数据 ): 存储二进制数据。
Code(代码 ): 将JavaScript代码存储到文档中。
Regular expression (_正则表达式 ): 存储正则表达式
注意点
● 每个⽂档都有⼀个属性, 为_id, 保证每个⽂档的唯⼀性,mongodb默认使用_id作为主键,可以⾃⼰去设置_id插⼊⽂档,如果没有提供, 那么MongoDB为每个⽂档提供了⼀个独特的_id, 类型为objectID
● objectID是⼀个12字节的⼗六进制数,每个字节两位,一共是24 位的字符串: 前4个字节为当前时间戳 接下来3个字节的机器ID 接下来的2个字节中MongoDB的服务进程id 最后3个字节是简单的增量值
3. 创建数据库
use DATABASE_NAME如果数据库不存在,则创建数据库,否则切换到指定数据库。db指的是当前数据库。
show dbs查看所有数据库。(新创建的数据库只有插入一条记录后才会显示)
4. 删除数据库
db.dropDatabase()删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。
5. 创建集合(表格)
db.createCollection(name, options)创建集合
- name: 要创建的集合名称。
options: 可选参数, 指定有关内存大小及索引的选项。
查看集合
show collections或者show tables
需要注意的是mongodb会在插入数据的时候自动创建集合,集合的名称会和数据库的名称一样。
6. 删除集合
db.collection.drop()成功删除选定集合,则 drop() 方法返回 true,否则返回 false。(collection代指要删除的集合名称 )
7. 插入文档(数据)
文档的数据结构和 JSON 基本一样。所有存储在集合中的数据都是 BSON 格式。BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。文档就是一条json数据,相当于sql中的一行数据。
db.collectionName.insertOne()插入一条数据(3.2版本以后)
db.collectionName.insertMany()插入多条数据(3.2版本以后)
参数说明:
- document:要写入的文档。
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
ordered:指定是否按顺序写入,默认 true,按顺序写入。
db.COLLECTION_NAME.insert(document)/db.COLLECTION_NAME.save(document)
save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
- insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
8. 更新文档
db.collectionName.updateOne()向指定集合更新单条文档(3.2版本以后)
db.collection.updateMany()向指定集合更新多条文档(3.2版本以后)
update() 方法。低版本中
用于更新已存在的文档。
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如inc…)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
实例:
save() 方法。低版本中
通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。
异常说明
- WriteConcern.NONE:没有异常抛出
WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
- WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
- WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。
移除集合中的键值对,使用的
$unset操作符。如果指定的字段不存在则操作不做任何处理。
9.删除文档
db.collectionName.deleteOne(<query>)删除单条数据 (高版本官方推荐)
db.collectionName.deleteMany(<query>)删除符合条件的所有数据 (高版本官方推荐)
db.collectionName.deleteMany({})删除整个表立面的所有数据 (高版本官方推荐)
remove()函数是低版本用来移除集合中的数据。在执行 remove() 函数前先执行find()命令来判断执行的条件是否正确,是一个比较好的习惯。
基本语法如下:
2.6 版本以后的语法格式如下:
参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。
10. 查询文档
db.collection.find(query, projection)查询数据
query :可选,使用查询操作符指定查询条件
projection :可选。若不指定 projection,则默认返回所有字段
projection的用法。
db.col.find().pretty()pretty()以格式化的方式来显示文档。
findOne与find语法一致,但是它只返回一条数据
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
以下实例通过 by 和 title 键来查询教程 中 MongoDB 教程 的数据
MongoDB OR 条件语句使用了关键字 $or ,语法格式如下:
以下实例中,我们演示了查询键 by 值为 教程 或键 title 值为 MongoDB 教程 的文档。
AND 和 OR 联合使用
11. 条件操作符
MongoDB 与 RDBMS Where 语句比较
模糊查询
12. $type 操作符
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果
如果想获取 “col” 集合中 title 为 String 的数据,你可以使用以下命令:
13. Limit与Skip方法
limit(n)是用来规定显示的条数。
skip(n)是用来在符合条件的记录中从第一个记录跳过的条数
两者一般结合使用。以下实例在集合中跳过前面 10 条返回 100 条数据。
14. 排序sort
skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
sort()方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中1 为升序排列,而-1 是用于降序排列。db.COLLECTION_NAME.find().sort({KEY:1})
15. 索引index
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
db.collection.createIndex(keys, options)创建索引
语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
createIndex()方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
查看索引合集
查看集合索引的大小
删除集合所有索引
删除集合指定索引
16. 数据导入导出
此命令需要安装
database tool工具。安装完成后加入系统环境变量path。
https://www.mongodb.com/try/download/database-tools?tck=docs_databasetools数据导出:mongoexport
Mongdb中的mongoexport工具可以将collection导出成JSON格式或者CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。
数据导入:mongoimport
注意:如果excel里面有中文、特殊符号,会抛出以下异常:exception:Invalid UTF8 character detected
此时,执行mongoimport命令前,您需要先将该csv文件编码转为 utf-8。数据备份(导出所有数据)数据恢复
注意:恢复的时候可以加–drop 覆盖原来的数据库(慎用),最好提前备份好当前数据库;同时要更改数据库名,不然恢复会失败。
17. composer导入数据
在
collection那里导入数据