Skip to content

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
数据库databasedatabase
数据库表/集合tablecollection
数据记录行/文档rowdocument
数据字段/域columnfield
索引indexindex
主键,MongoDB自动将_id字段设置为主键primary keyprimary 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

image.png

(三)、集合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