主题
MongoDB基本使用
NoSQL出现的目的
在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面: 1、低延迟的读写速度:应用快速地反应能极大地提升用户的满意度 2、支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量 3、大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理 4、庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低
为了克服这一问题,NoSQL应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员和仓库管理人员的青睐。
一、mongoDB概述
MongoDB 是一种文档数据库,是一个由C++ 语言编写的基于分布式文件存储的数据库。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 它支持的数据结构非常松散,是类似json的 bson 格式,因此可以存储比较复杂的数据类型。 MongoDB 使用集合和文档,而不是传统关系数据库中的表和行。
BSON:BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
1、mongodb特点
高性能、易部署、易使用,存储数据非常方便。 Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
2、有了关系型数据库,为什么还会使用MongoDB?
虽说现在关系型数据库还是主流,但是它也不是万能的,在面对某些需求的时候,需要非关系型数据库来补充它。我们不应该针对关系型数据库和非关系型数据库来论谁好谁不好,而是在某些需求场景下论用谁更合适。 MongoDB是一个功能丰富的NoSQL数据库。
3、MongoDB优势与不足(与关系型数据库相比 )
优势
- 与关系数据库相比,性能调整轻而易举。
- 非常容易扩展。
- 因为它是一个 NOSQL 数据库,它本质上是安全的,因为它不能执行 SQL 注入。
- MongoDB 支持的文档查询语言在支持动态查询方面起着至关重要的作用。
- MongoDB 不需要使用虚拟机。
- 由于它将数据存储在内部存储器中,因此可以更快地访问数据。
- 不需要将应用程序对象与数据对象相关联。
- MongoDB 也可以用作文件系统,这使得负载平衡更加容易。
- 有大量可访问的文档。
不足
- mongodb不支持事务操作,所以事务要求严格的系统(如果银行系统)肯定不能用它。
- mongodb占用空间过大。
- MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方。
4、适用场合
(1)网站数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性 (2)缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由 MongoDB 搭建的持久化缓存层可以避免下层的数据源过载 (3)大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储 (4)高伸缩性的场景:MongoDB 非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对 MapReduce 引擎的内置支持 (5)用于对象及 JSON 数据的存储:MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询
二、mongoDB里面的一些概念
数据库 集合 文档
MongoDB是非关系型数据库当中最像关系型数据库的,所以我们通过它与关系型数据库的对比,来了解下它的概念。
概念 | SQL数据库 | MongoDB |
---|---|---|
数据库 | database | database |
数据库表/集合 | table | collection |
数据记录行/文档 | row | document |
数据字段/域 | column | field |
索引 | index | index |
主键,MongoDB自动将_id字段设置为主键 | primary key | primary key |
三、mongodb基本使用
注意:
- MongoDB中,数据库和集合(表)都不需要我们手动创建,当我们插入文档(数据)时,若没有对应的数据库或集合则会自动创建。
(一)、连接mongodb(命令)
成功启动MongoDB服务后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作。
提示:若是设置了访问控制(登录账户密码)的话,运行mongo后,需要运行 db.auth("登录名",passwordPrompt()),并且输入密码才行
1.1、mongodb常用命令
输入help可以看到基本操作命令:
命令 | 作用 |
---|---|
help | 显示所有基本操作命令 |
show dbs | 显示数据库列表 |
show collections | 显示当前数据库中的集合(类似关系数据库中的表) |
show users | 显示用户 |
show dbs | 显示数据库列表 |
use <db name> | 切换当前数据库,这和MySQL里面的意思一样 当创建一个集合(table)的时候会自动创建当前数据库 |
db.help() | 显示数据库操作命令,里面有很多的命令 |
db.foo.help() | 显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令 |
db.foo.find() | 对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据) |
db.foo.find( { a : 1 } ) | 对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1 |
注意:
- 命令db.xxx里面的 db 命令表示当前所处的数据库
(二)、数据库的基本操作
1、创建数据库
MongoDB没有创建数据库的命令,但有类似的命令。
- 如果你想创建一个“myTest”的数据库,先运行
use myTest
命令,之后就做一些操作(如:db.createCollection('user')),这样就可以创建一个名叫“myTest”的数据库。
2、删除当前使用数据库
db.dropDatabase();
3、从指定主机上克隆数据库
db.cloneDatabase(“127.0.0.1”); // 将指定机器上的数据库的数据克隆到当前数据库
4、从指定的机器上复制指定数据库数据到某个数据库
db.copyDatabase("mydb", "temp", "127.0.0.1"); // 将本机的mydb的数据复制到temp数据库中
5、修复当前数据库
db.repairDatabase();
6、查看当前使用的数据库
db.getName();
db;
// db和getName方法是一样的效果,都可以查询当前使用的数据库
7、显示当前db状态
db.stats();
8、当前db版本
db.version();
9、查看当前db的链接机器地址
db.getMongo();
10、文档导入(将整个文档导入数据库)
这里有一点需要注意一下,在使用 mongoimport模块的时候必须要退出 mongo环境!!!
mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field
例子: mongoimport -d playground -c users --file ./user.json
- -d:数据库名
- -c:集合名称
- --file : 选择导入的文件
- -type : 文件类型,默认json
- -f : 字段,type为csv是必须设置此项
注意:
- 若是没有配置mongodb环境变量,可能会找不到
mongoimport
命令
11、集合导出
这里有一点需要注意一下,在使用 mongoexport模块的时候必须要退出 mongo环境!!! 导出命令:mongoexport
js
mongoexport -d dbname -c collectionname -o filepath --type json/csv -f field
- -d:数据库名
- -c:集合名称
- -o : 导出数据文件的路径(必须是文件路径,不能是文件夹,否则报错,文件可以不存在,它会自己创建)
- -type : 导出数据类型,默认json
- -f 要导出的字段
例如:
mongoexport -d blog-2022 -c articles -o /root/db-mongo/articles.json --type json
12、导出导入整个数据库
导出
sh
$ mongodump -d <database_name> -o <directory_backup>
-d:数据库名 -o : 导出数据库文件夹的路径(可以不存在,它会自己创建)
导入
sh
$ mongorestore -h connection -d dbname --dir filepath
参数说明: -h: 连接IP和端口号(默认127.0.0.1:27017) -d: 数据库名 --dir: 备份的数据库的路径
导入示例 mongorestore -h 127.0.0.1 -d wcx2020 --dir D:\mongodbBackup
注意事项: 恢复的时候可以加--drop 覆盖原来的数据库(慎用),最好提前备份好当前数据库;同时要更改数据库名,不然恢复会失败。
13、文档导入导出时候报错
报错一
sh
uncaught exception: SyntaxError: unexpected token: identifier :
@(shell):1:15
原因:没有退出mongo环境 退出mongo环境后再运行语句
报错二 mongodb安装完成之后, 想通过命令导入json,txt,dat文件, 报错:
sh
uncaught exception: SyntaxError: unexpected token: identifier:
@(shell):1:20
原因: 我的mongodb是msi安装版, bin目录并没有 mongoimport.exe工具类 解决:下载文件的bin目录中所有文件, 复制到mongodb的bin目录, 就可以用命令导入了 下载地址:https://fastdl.mongodb.org/tools/db/mongodb-database-tools-windows-x86_64-100.5.2.zip
https://www.mongodb.com/try/download/database-tools
(三)、集合Collection(表)的基本操作
1、创建一个聚集集合(table)
db.createCollection(“collName”, {size: 20, capped: 5, max: 100});
2、得到指定名称的聚集集合(table)
db.getCollection("account");
3、得到当前db的所有聚集集合
db.getCollectionNames();
4、显示当前db所有聚集索引的状态
db.printCollectionStats();
(四)、 修改、添加、删除集合数据
1、添加数据
db.<表名>.save({name: "zhangsan", age: 25, sex: true});
添加的数据的数据列,没有固定,根据添加的数据为准
2、修改数据
db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);
// 相当于:update users set name = 'changeName' where age = 25;
db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
// 相当于:update users set age = age + 50 where name = 'Lisi';
db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
// 相当于:update users set age = age + 50, name = 'hoho' where name = ‘Lisi’;
3、删除数据
db.users.remove({age: 132});
(五)、 查询数据
1、查询所有记录
db.userInfo.find();
// 相当于:select* from userInfo;
//默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”
//但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。
2、查询去掉后的当前聚集集合中的某列的重复数据
db.userInfo.distinct("name");
// 会过滤掉name中的相同数据
// 相当于:select distict name from userInfo;
3、查询age = 22的记录
db.userInfo.find({"age": 22});
// 相当于: select * from userInfo where age = 22;
4、查询age > 22的记录
db.userInfo.find({age: {$gt: 22}});
// 相当于:select * from userInfo where age >22;
5、查询age < 22的记录
db.userInfo.find({age: {$lt: 22}});
// 相当于:select * from userInfo where age <22;
6、查询age >= 25的记录
db.userInfo.find({age: {$gte: 25}});
// 相当于:select * from userInfo where age >= 25;
7、查询age <= 25的记录
db.userInfo.find({age: {$lte: 25}});
8、查询age >= 23 并且 age <= 26
db.userInfo.find({age: {$gte: 23, $lte: 26}});
9、查询name中包含 mongo的数据
db.userInfo.find({name: /mongo/});
//相当于%% select * from userInfo where name like ‘%mongo%’;
10、查询name中以mongo开头的
db.userInfo.find({name: /^mongo/});
// select * from userInfo where name like ‘mongo%’;
11、查询指定列name、age数据
db.userInfo.find({}, {name: 1, age: 1});
// 相当于:select name, age from userInfo;
// 当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。
12、查询指定列name、age数据, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
// 相当于:select name, age from userInfo where age >25;
13、按照年龄排序
// 升序:
db.userInfo.find().sort({age: 1});
// 降序:
db.userInfo.find().sort({age: -1});
14、查询name = zhangsan, age = 22的数据
db.userInfo.find({name: 'zhangsan', age: 22});
// 相当于:select * from userInfo where name = ‘zhangsan’ and age = ‘22’;
15、查询前5条数据
db.userInfo.find().limit(5);
// 相当于:selecttop 5 * from userInfo;
16、查询10条以后的数据
db.userInfo.find().skip(10);
/* 相当于:
select * from userInfo where id not in (
selecttop 10 * from userInfo
);
*/
17、查询在5-10之间的数据
db.userInfo.find().limit(10).skip(5);
// 可用于分页,limit是pageSize,skip是第几页*pageSize
18、or 查询
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
// 相当于:select * from userInfo where age = 22 or age = 25;
19、查询第一条数据
db.userInfo.findOne();
/*
相当于:
selecttop 1 * from userInfo;
*/
db.userInfo.find().limit(1);
20、查询某个结果集的记录条数
db.userInfo.find({age: {$gte: 25}}).count();
// 相当于:select count(*) from userInfo where age >= 20;
21、按照某列进行排序
db.userInfo.find({sex: {$exists: true}}).count();
// 相当于:select count(sex) from userInfo;
(六)、用户相关操作
1、添加一个用户
db.addUser("name");
db.addUser("userName", "pwd123", true); 添加用户、设置密码、是否只读
2、数据库认证、安全模式
db.auth("userName", "123123");
3、显示当前所有用户
show users;
4、删除用户
db.removeUser("userName");
(七)、错误相关
1、查询之前的错误信息
db.getPrevError();
2、清除错误记录
db.resetError();
四、参考文章
MongoDB详细文档:http://c.biancheng.net/view/6543.htmlhttps://www.cnblogs.com/TankMa/archive/2011/06/08/2074947.htmlhttps://www.cnblogs.com/cswuyg/p/4595799.html