主题
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 json12、导出导入整个数据库 
导出
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是第几页*pageSize18、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
