MongoDB入门

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 2018年7月5日笔记1.MongoDB简介1.1 NoSQL数据库是什么NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同的传统的关系型数据库的数据库管理系统的统称。

2018年7月5日笔记

1.MongoDB简介

1.1 NoSQL数据库是什么

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同的传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
主要解决:
1.对数据库高并发的需求
2.对海量数据的高效率存储和访问的需求
3.对数据库的高扩展性和高可用性的需求

1.2 什么是MongoDB

取自“humongous”(海量),是由10gen团队2007年10月开发并维护的开源,高性能,可扩展,无模式,面向文档(document-oriented)的数据库。其内存储的一种-like结构化数据。它介于关系数据库和非关系数据库之间,是非关系数据库中最像关系数据库的。是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储方案。
官网:http://www.mongodb.com
最新版本:3.6.3(3/20/2018)
支持操作系统:OSX/linux/Windows

1.3 MongoDB数据库的特点

高性能、易部署、易使用、存储数据数据非常方便。主要功能特性有:
1.面向集合存储,易存储对象类型的数据
2.模式自由(没有行,列,关系等概念)
3.支持完全索引,包含内部对象。
4.支持查询
5.支持复制和故障恢复
6.使用高效的二进制数据存储,包括大型对象
7.自动处理碎片,以支持云计算层次的扩展性
8.支持C#、Python、Ruby、Java、C、Javascript、Perl以及C++语言的驱动程序,社区中也提供了对Erlang以及.NET及平台的扩展程序。
9.文件存储格式为BSON(一种JSON的扩展)
10.可通过网络访问

优点:弱一致性、文档结构的存储方式、内置GridFS(分布式文件系统)
缺点:不支持事务、空间占用大

1.4 MongoDB数据库的适用场合

适用场景
1.网站实时数据处理。它非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2.缓存。由于性能很高,他适合作为信息基础建设的缓存层。在系统重启之后,由它搭建的数据持久化存储层可以避免下层的数据源过载。
3.高伸缩性的场合。非常适合由数十或者数百台服务器组成的数据库,它的路线图中已经包含对MapReduce引擎的内置支持。
不适用场景
1.类似银行或会计系统这种高事务性的系统。
2.传统的商业智能应用
3.复杂的跨文档级联查询

1.5 MongoDB

视觉中国、大众点评、淘宝、优酷、淘宝

2.MongoDB的基本使用

MongoDB的软件安装教程:Windows 平台安装 MongoDB教程
下面的命令能够正确运行的前提是已经启动MongoDB服务

进入MongoDB的Shell.png-26.3kB
进入MongoDB的Shell.png-26.3kB

2.1 显示已有的数据库

命令:show dbs


图片.png-1kB
图片.png-1kB

2.2 创建库

使用use runoob就已经创建一个名为runoob的数据库,但必须要往runoob数据库中的一个集合中插入一条数据才能用show dbs命令看到runoob数据库,db.mycoll.insert({name:'runoob'})这一句就是往mycoll这个集合中插入一条name字段值为runoob的数据。
在MongoDB中,数据库和集合不需要提前创建,只要使用就自动创建。
命令:

use runoob
db.mycoll.insert({name:'runoob'})
show dbs

2.3 删除数据库

命令:db.dropDatabase()


图片.png-3.5kB
图片.png-3.5kB

2.4 创建集合

命令:db.createCollection(name,options)
name参数的数据类型是字符串,意义是要创建的集合名称
options参数的数据类型是json格式的文本,意义是制定有关内存大小和索引选项
options可以是如下参数:

图片.png-16.1kB
图片.png-16.1kB

从下图中可以看出,一开始使用 show collections显示没有集合,创建第一个简单的集合 mycoll,第二个带参数的集合 mycoll2,创建两个集合后,可以用 show collections可以显示这两个集合的存在。
图片.png-4.5kB
图片.png-4.5kB

2.5 删除集合

命令:db.{}.drop(),大括号中的要填入的内容是要删除的集合的名称。

图片.png-1.6kB
图片.png-1.6kB

3.MongoDB进阶

3.1 MongoDB常见数据类型

1.String:这是最常见的数据类型来存储数据,在MongoDB中的字符串必须是有效的UTF-8
2.Integer:这种类型是用来存储一个数值。整数可以是32位或64位,这取决与运行软件的机器。
3.Boolean:用来存储布尔值(true/false)
4.Double:用来存储浮点值
5.Min/Max Keys: 用来对BSON元素的最低和最高值比较
6.Arrays:使用此类型的数组或列表存储到一个键
7.Timestamp:时间戳,这可以方便记录的文件已被修改或添加
8.Object:此类型嵌入式的文件中
9.Null:这种类型是用来存储一个Null的
10.Symbol:用于字符串相同,但它通常是保留给特定符号类型的语言使用。
11.Date:用于存储当前时间或日期的Unix时间格式,可以指定自己的日期和时间。
12.ObjectID:用于存储文档的ID
13.Binary data:用于存储二进制数据
14.Regular expression:用于存储正则表达式

3.2 MongoDB插入文档

命令语法:db.{}.insert({}),第一个大括号填入集合名,第二个大括号填入要插入的文档

图片.png-7.3kB
图片.png-7.3kB

3.3 MongoDB更新文档

命令语法:db.{}.update({},{}),第一个大括号填入集合名,第二个大括号填入json格式的文本,第三个括号填入两层json格式文本,第一层的第一个元素的键为$set

图片.png
图片.png

从上图中可以看到集中mycoll中的第一个文档中的第一个元素title的值从MongoDB overview改为了MongoDB。

3.4 MongoDB Save()方法

命令语法: db.{}.save({}),第一个大括号填入集合名,第二个大括号填入json格式的文本

图片.png
图片.png

3.5 MongoDB删除文档

命令语法: db.{}.remove({},{}),第一个大括号填入集合名,第二个大括号填入json格式的文本,用于选择被删除的文档,成对大括号内可以为空,第三个括号内为非0整数或true时,删除一条满足判断语句的文档。

图片.png
图片.png

第三个括号内为0或false或者不填时,删除所有满足判断语句的文档,如下图所示。
图片.png
图片.png

4.MongoDB查询文档

4.1 find()方法

从MongoDB中查询集合数据,需要使用MongoDB的find()方法。
命令语法:db.{}.find({}),第一个大括号填入集合名,第二个大括号填入json格式的文本
如下图所示,find()函数没有参数时,显示这个集合当中的所有文档;
find()函数有参数,但是没有找到满足判断条件的语句时,没有打印结果

图片.png-5.4kB
图片.png-5.4kB

使用pretty()方法可以使在命令行中的数据打印更整齐。
图片.png-6.4kB
图片.png-6.4kB

4.2 limit()方法

图片.png-10.4kB
图片.png-10.4kB

作业

  1. 创建数据库 school 用来存放一些班级学生信息;

use school
db.createCollection("students")

  1. 你要为学校下的各个年级、班级建立集合;创建集合可以是显式的,也可以是隐式的;在这路你需要显式地创建“一年级一班的”集合grade_1_1;

use school
db.createCollection("grades")
db.createCollection("classes")
db.createCollection("grade_1_1")

  1. 隐式创建“一年级二班”:grade_1_2创建的同时为“一年级二班”加入一个学生:"name": 'zhangsan', "age": '7', "sex": "0"

use school
db.grade_1_2.insert({name:"zhangsan",age:7,sex:0})

  1. 因为一些特殊原因,要解散一年级二班,删除一年级二班的信息

use school
school.grade_1_2.drop()

  1. 使用循环创建一年级的3个班,并随机添加 10 名学生
for(grade_index in (grade = ['grade_1_1', 'grade_1_2', 'grade_1_3'])) {
       for (var i = 1; i <= 10; i++) {

           db[grade[grade_index]].insert({
               "name": "zhangsan" + i,
               "sex": Math.round(Math.random() * 10) % 2,
               "age": Math.round(Math.random() * 6) + 3,
               "hobby": []
           });
       }
   }

6.查看一年级二班grade_1_2中的所有学生

db.grade_1_2.find()

7.查看一年级二班grade_1_2中所有年龄是 4 岁的学生

db.grade_1_2.find({age:4})

8.查看一年级二班grade_1_2中所有年龄大于 4 岁的学生

db.grade_1_2.find({age:{$gt:4}})

9.查看一年级二班grade_1_2中所有年龄大于 4 岁并且小于 7 岁的学生

db.grade_1_2.find({age:{gt:4,lt:7}})

10.查看一年级二班grade_1_2中所有年龄是 4 岁或 6 岁的学生

db.grade_1_2.find({$or:[{age:4},{age:6}]})

11.查看一年级二班grade_1_2中所有姓名带zhangsan1的学生

db.grade_1_2.find({name:{$regex:"zhangsan1"}})

12.查看一年级二班grade_1_2中所有姓名带zhangsan1和zhangsan2的学生

db.grade_1_2.find({$or:[{name:"zhangsan1"},{name:"zhangsan2"}]})

13.查看一年级二班grade_1_2中所有兴趣爱好有三项的学生

db.grade_1_2.find({hobby:{$size:3}})

14.查看一年级二班grade_1_2中所有兴趣爱好包括画画的学生

db.grade_1_2.find({hobby:"drawing"})

15.查看一年级二班grade_1_2中所有兴趣爱好既包括画画又包括跳舞的学生

db.grade_1_2.find({hobby:{$all:{"drawing","dance"}}})

16.查看一年级二班grade_1_2中所有兴趣爱好有三项的学生的 学生数目

db.grade_1_2.find({hobby:{$size:3}}).count()

17.查看一年级二班的第二位学生

db.grade_1_2.find().limit(1).skip(1)

18.查看一年级二班的学生,按年纪升序

db.grade_1_2.find().sort({age:1})

19.查看一年级二班的学生,按年纪降序

db.grade_1_2.find().sort({age:-1})

20.查看一年级二班的学生,年龄值有哪些

db.grade_1_2.distinct('age')

21.查看一年级二班的学生,兴趣覆盖范围有哪些

db.grade_1_2.distinct('hobby')

22.查看一年级二班的学生,男生(sex为 0)年龄值有哪些

db.grade_1_2.distinct('age',{'sex':0})

23.一年级二班grade_1_2, 删除所有 4 岁的学生

db.grade_1_2.remove({age:4})

24.一年级二班grade_1_2, 删除第一位 6 岁的学生

db.grade_1_2.remove({age:4},1)

25.一年级二班grade_1_2中,修改名为zhangsan7的学生,年龄为 8 岁,兴趣爱好为 跳舞和画画;

db.grade_1_2.update({name:"zhangsan7"},{$set:{age:8,hobby:["dance","drawing"]}})

26.一年级二班grade_1_2中,追加zhangsan7学生兴趣爱好唱歌;

db.grade_1_2.update({name:"zhangsan7"},{$push:{hobby:"sing"}})

27.一年级二班grade_1_2中,追加zhangsan7学生兴趣爱好吹牛和打篮球;

db.grade_1_2.update({"name": "zhangsan7"},{$push: {"hobby": {$each: ["brag","basketball"]}}})

28.一年级二班grade_1_2中,追加zhangsan7学生兴趣爱好唱歌和打篮球,要保证hobby数组不重复;

db.grade_1_2.update({"name": "zhangsan7"},{$addToSet: {"hobby": {$each: ["sing","basketball"]}}})

29.新学年,给一年级二班所有学生的年龄都增加一岁

db.grade_1_2.update({},{$inc:{"age":1}},{multi:true})

30.一年级二班grade_1_2中,删除zhangsan7学生的sex属性

db.grade_1_2.update({name:"zhangsan7"},{$unset:{sex:1}})

31.一年级二班grade_1_2中,删除zhangsan7学生的hobby数组中的头元素

db.grade_1_2.update({name:"zhangsan7"},{$pop:{hobby:-1}})

32.一年级二班grade_1_2中,删除zhangsan7学生的hobby数组中的尾元素

db.grade_1_2.update({name:"zhangsan7"},{$pop:{hobby:1}})

33.一年级二班grade_1_2中,删除zhangsan7学生的hobby数组中的sing元素

db.grade_1_2.update({name:"zhangsan7"},{$pull:{hobby:"sing"}})

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
存储 NoSQL 关系型数据库
一.MongoDB入门-MongDB介绍和安装
MongoDB入门-MongDB介绍和安装
|
NoSQL MongoDB 索引
开心档-软件开发入门之MongoDB 覆盖索引查询
开心档-软件开发入门之MongoDB 覆盖索引查询
74 0
|
2月前
|
NoSQL MongoDB
MongoDB入门-sort和投影
这篇文章介绍了MongoDB中的排序(sort)和投影(projection)操作,通过示例代码展示了如何使用这些功能来控制查询结果的排序顺序和返回的字段。
36 3
MongoDB入门-sort和投影
|
2月前
|
NoSQL MongoDB
MongoDB入门-MongoDB的CURD语句练习
这篇文章提供了MongoDB的CURD操作的练习,涵盖了插入、查询、更新和删除数据的基本命令,并通过具体示例展示了如何在MongoDB中执行这些操作。
44 2
|
1月前
|
存储 NoSQL MongoDB
MongoDB入门级别教程全(Windows版,保姆级教程)
一份全面的MongoDB入门级教程,包括在Windows系统上安装MongoDB、使用MongoDB Shell和Compass GUI进行数据库操作,以及MongoDB的基本数据类型和查询技巧。
66 2
MongoDB入门级别教程全(Windows版,保姆级教程)
|
3月前
|
NoSQL BI 数据处理
【超实用攻略】MongoDB 聚合框架:从入门到精通,带你解锁数据处理新姿势!
【8月更文挑战第24天】MongoDB是一款以其灵活性和高性能闻名的NoSQL数据库。其强大的聚合框架采用管道式处理,允许用户定义多个数据处理阶段如过滤、分组等。本文通过示例数据库`orders`和`products`,演示如何利用聚合框架计算各产品的总销售额。示例代码展示了使用`$lookup`连接两集合、`$unwind`打平数组及`$group`按产品ID分组并计算总销售额的过程。这突显了聚合框架处理复杂查询的强大能力,是进行数据分析和报表生成的理想选择。
53 3
|
3月前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
77 0
|
6月前
|
存储 NoSQL MongoDB
【MongoDB 专栏】MongoDB 入门指南:从零开始学习
【5月更文挑战第10天】本文介绍了MongoDB,一个流行的NoSQL数据库,以其灵活的数据模型和高性能著称。内容包括MongoDB的基础知识、安装配置、文档数据模型、数据库操作(如创建、查询、更新和删除)、索引创建、数据备份恢复及性能优化策略。此外,还探讨了MongoDB在社交网络、电子商务等领域的应用。对于初学者,本文提供了从零开始学习MongoDB的入门指导。
106 0
【MongoDB 专栏】MongoDB 入门指南:从零开始学习
|
6月前
|
存储 NoSQL MongoDB
Mongodb 入门
Mongodb 入门
40 0
|
运维 NoSQL MongoDB
[慕课笔记]mongodb入门篇
[慕课笔记]mongodb入门篇
62 1
下一篇
无影云桌面