MongoDB的学习
2024-11-21 12:44:57
MongoDB数据库的学习与使用
2704

一、 MongoDb 数据库介绍、安装、使用

1、数据库和文件的主要区别 

  1. 数据库有数据库表、行和列的概念,让我们存储操作数据更方便
  2. 数据库提供了非常方便的接口,可以让nodejs、php、java、.net很方便的实现增加修改删除功能

2、NoSql介绍 

2.1简介

由于互联网的迅速发展,云计算与Web2.0。这样大量的交互给数据库提出了更高的性能要求,传统的数据库(本文泛指SQL数据库),即关系数据库虽然具备良好的事物管理,但在处理

大量数据的应用时很难在性能上满足设计要求。NoSQL就是主要为了解决当下大量高并发高要求的数据库应用需求,关系数据库具有严格的参照性,一致性,可用性,原子性,隔离性等特点,因此会产生一些例如表连接等操作,这样会大大降低系统的性能。而在当前很多应用场景下对性能的要求远远强于传统数据库关注的点,NoSQL就是为了解决大规模数据与多样数据种类等问题,尤其是其中大数据的相关问题。NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,它指的是非关系型的数据库,是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准、ACID属性、表结构等等。NoSQL最早被提出是在20世纪80年代,在当时更多是强调的是与关系数据库区别对待,最近这些年被提及的更多是强调协助解决大数据等相关问题。NoSQL在大数据时代有自己的意义。

2.2NoSQL应用情况介绍

国内的互联网蓬勃发展,不仅涌现出BAT(百度,阿里巴巴,腾讯)之类的巨头,也带动了整个互联网行业的发展,大量的创业型公司如春笋般的涌出,在国家层面也提出了“互联网+”和“万众创业”的口号。更多传统的行业也开始拥抱互联网。但是无论是做所谓的生态平台还是传统业务的转型,涉及到的业务是多种多样的。这个时候企业架构师对于应用系统的核心——数据库管理不仅有传统的SQL选项也有了

2.3NoSQL这种适合特定场景需求的选项。

NoSQL数据库在以下的这几种情况下比较适用:

  1. 数据模型比较简单;
  2. 需要灵活性更强的IT系统;
  3. 对数据库性能要求较高;
  4. 不需要高度的数据一致性;
  5. 对于给定key,比较容易映射复杂值的环境。

2.4NoSQL发展现状

国外:Google的BigTable 和Amazon 的Dynamo使用的就是NoSQL型数据库。

国内:百度、阿里、腾讯、新浪微博、视觉中国、优酷运营数据分析、飞信空间、豆瓣社区等..

3、什么时候建议使用NoSql 

  1. 对数据库高并发读写的需求
  2. 对海量数据的高效率存储和访问的需求
  3. 对数据库的高可扩展性和高可用性的需求

4、NoSql和传统数据库简单对比。 

  1. 非结构型数据库
  2. 没有行、列的概念
  3. 用JSON来存储数据
  4. 集合就相当于“表”,文档就相当于“行”

5、MongoDb介绍 

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它的特点是高性能、易部署、易使用,存储数据非常方便。

6、MongoDb安装 

官网:https://www.mongodb.com/

手册:https://docs.mongodb.org/manual/

注意:部分win7系统需要安装补丁,KB2731284。

  1. 双击MongoDB软件下一步下一步安装
  2. 安装完成配置环境变量bin加入到系统的path环境变量中
  3. 打开cmd 输入:mongo命令看看是否成功。如果出来下图说明mongodb配置成功。

7、使用MongoDb 

1. 新建一个存放数据库的文件夹,注意:不能有中文和空格,建议不要放在C盘

2.启动MongoDb服务

服务端:mongod 开启数据库服务mongod --dbpath C:mongodb

开启MongoDb服务命令:

--dbpath就是选择数据库文档所在的文件夹。

3.客户端输入mongo 命令连接服务端

客户端:mongo  使用数据库

客户端:mongo  使用数据库ip地址:端口号

第二章、MongoDB 数据库创建删除、表(集合)创建删除、数据增删改查 

一、数据库使用 

开启mongodb服务:要管理数据库,必须先开启服务,开启服务使用

mongod --dbpath c:mongodb

管理mongodb数据库:

mongo (一定要在新的cmd中输入)

清屏

cls

查看所有数据库列表

show dbs

二、创建数据库 

使用数据库、创建数据库

use student

如果真的想把这个数据库创建成功,那么必须插入一个数据。

数据库中不能直接插入数据,只能往集合(collections)中插入数据。不需要专门创建集合,只

需要写点语法插入数据就会创建集合:

db.student.insert({“name”:”xiaoming”});

db.student系统发现student是一个陌生的集合名字,所以就自动创建了集合。

显示当前的数据集合(mysql中叫表)

show collections

删除数据库,删除当前所在的数据库

db.dropDatabase();

删除集合,删除指定的集合删除表

删除集合db.COLLECTION_NAME.drop()

db.user.drop()

三、插入(增加)数据 

插入数据,随着数据的插入,数据库创建成功了,集合也创建成功了。

db.表名.insert({"name":"zhangsan"}); 

四、 查找数据 

1、查询所有记录

db.userInfo.find();

相当于:select* from userInfo;

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、按照年龄排序1升序-1降序

升序: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(5).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、findOne查询第一条数据

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;如果要返回限制之后的记录数量,要使用count(true)或者count(非0) db.users.find().skip(10).limit(5).count(true);

四、修改数据 

修改里面还有查询条件。你要该谁,要告诉mongo。查找名字叫做小明的,把年龄更改为16岁:

db.student.update({"name":"小明"},{$set:{"age":16}});

查找数学成绩是70,把年龄更改为33岁:

db.student.update({"score.shuxue":70},{$set:{"age":33}});

更改所有匹配项目:"

By default, the update() method updates a single document. To update multiple documents, use the multi option in the update() method. 

db.student.update({"sex":"男"},{$set:{"age":33}},{multi: true});

完整替换,不出现$set关键字了:注意

db.student.update({"name":"小明"},{"name":"大明","age":16});
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’;

五、 删除数据 

db.collectionsNames.remove( { "borough": "Manhattan" } )
db.users.remove({age: 132});

默认情况下,remove()方法删除所有匹配remove条件的文档。使用他justOne选项将删除操作限制为仅一个匹配的文档。

db.restaurants.remove( { "borough": "Queens" }, { justOne: true })

第三章、MongoDB 索引 和 explain 的使用

创建索引:

db.user.ensureIndex({"username":1})

获取当前集合的索引:

db.user.getIndexes()

删除索引:

db.user.dropIndex({"username":1})

创建复合索引:

db.user.ensureIndex({"username":1, "age":-1})

创建唯一索引:

db.user.ensureIndex({"userid":1},{"unique":true})

创建复合唯一索引:

db.user.ensureIndex({"username":1, "age":-1},{"unique":true})

ensureIndex的参数

  • background:是否后台操作
  • unique:建立的索引是否唯一
  • name:索引的名称
  • dropDups:建立唯一索引是否删除重复记录

使用explain查询具体的执行时间

db.user.find().explain( "executionStats" )