MongoDB学习笔记一(MongoDB介绍 + 基本指令 + 查询语句)
什么是MongoDB
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
不同与关系型数据库的是, MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
1.主要特点
- MoginDB 是一个面向文档存储的数据库, 操作起来比较简单和容易
- 你可以在MongoDB记录中设置任何属性的索引(如:
FirstName-"Sameer"
,Address =8 Gandi Road"
) 来实现更快的查询 - 你可以通过本地或网络创建数据镜像, 这是的MongoDB有更强的扩展性
- Mongo支持丰富的查询表达式, 查询指令使用
JSON
形式的标记, 可轻易查询文档中内嵌的对象及数组 - MongoFB中的
Map/reduce
主要是用来对数据进行批量处理和聚合操作
*Map
和Reduce
. Map函数调用emit ( key, value )
遍历集合中所有的记录,将key
与value
传给Reduce
函数进行处理 Map
函数和Reduce
函数是使用JavaScript
编写的, 并且可以通过db.runCommand
或mapreduce
命令来执行mapReduce
操作- MongoDB允许在服务端执行脚本, 可以用 JavaScript 编写某个函数, 直接服务端执行, 也可以把函数的定义存储在服务端, 下次直接调用即可
- MongoDB支持各种变成语言:
RUBY
,PYTHON
,JAVA
,PHP
,C#
等多种语言 - MongoDB安装简单
2. MongoDB与MySQL的区别
一、关系型数据库 - MySQL
- 在不同的引擎上有不同的存储方式
- 查询语句是使用传统的sql语句, 拥有较为成熟的体系, 成熟度很好
- 开源数据库的份额在不断增加, mysql的份额也在持续增长
- 缺点就是在海量数据操作的时候效率会显著变慢
二、非关系性数据库 - MongoDB
非关系性数据库(No SQL), 属于文档型数据库
- 存储方式: 虚拟内存 + 持久化
- 查询语句: 是独特的MongoDB的查询方式
- 适合场景: 事件的记录, 内容管理或者博客平台等等
- 架构特点: 可以通过副本集, 以及分片来实现高可用
- 数据处理: 数据是存储在硬盘上的, 只不过需要经常读取的数据会被加载到内存中, 将数据存储在物理内存中, 从而达到高速读写
三、优缺点
MongoDB的优点
- 在适量级的内存的MongoDB的性能是非常迅速的, 它将热数据存储在物理内存中, 使得热数据的读写变得十分快
- MongoDB的高可用和集群架构拥有十分高的扩展性
- 在副本集中, 当主库遇到问题, 无法继续提供服务的适合, 副本集将选举一个新的主库继续提供服务
- MongoDB的
BSON
和JSON
格式的数据十分适合文档格式的存储与查询 - 适合那些对数据库具体数据格式不明确或者数据库数据格式经常变化的需求模型,而且对开发者十分友好
- 自带一个分布式文件系统,可以很方便地部署到服务器机群上
MongoDB的缺点
- MongoDB对数据间的事务关系支持比较弱
- 在MongoDB中频繁的进行数据增删改时,如果记录变了,例如数据大小发生了变化,这时候容易产生一些数据碎片,出现碎片引发的结果
四、MySQL和MongoDB的主要应用场景
- 如果需要将mongodb作为后端db来代替mysql使用,即这里mysql与mongodb 属于平行级别,那么,这样的使用可能有以下几种情况的考量:
(1) mongodb所负责部分以文档形式存储
,能够有较好的代码亲和性,json格式的直接写入方便。(如日志之类)
(2)从datamodels
设计阶段就将原子性
考虑于其中,无需事务之类的辅助。开发用如nodejs之类的语言来进行开发,对开发比较方便。
(3)mongodb本身的failover机制
,无需使用如MHA之类的方式实现。 - 将mongodb作为类似
redis
,memcache
来做缓存db,为mysql提供服务,或是后端日志收集分析。 考虑到mongodb属于No SQL型数据库,sql语句与数据结构不如mysql那么亲和 ,也会有很多时候将mongodb做为辅助mysql而使用的类redis memcache 之类的缓存db来使用。 亦或是仅作日志收集分析。
3.MongoDB概念解析
SQL术语/概念 | MoingoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接, MongoDB不支持 | |
primary key | primary key | 主键, MongoDB自动将 _id 字段设置为主键 |
当我们在创建文档时, 如果文档所在的集合或数据库不存在, 则会自动创建数据库和集合
4.基本指令
4.1 创建数据库
语法:
use DATABASE_NAME
如果使用的数据库不存在, 则创建数据库, 否则切换到指定数据库
db
: 代表的是当前所使用的数据库
4.2 查看所有数据库
语法:
show dbs
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
**注意**: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
4.3 删除数据库
语法:
db.dropDatabase()
4.4 创建集合
MongoDB 中使用 createCollection()
方法来创建集合
语法:
db.createCollection(<name>, options)
参数说明:
capped <Boolean>
: (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。
当该值为 true 时,必须指定 size 参数。size <Number>
: (可选)为固定集合指定一个最大值,即字节数。如果 capped 为 true,也需要指定该字段。max <Number>
: (可选)指定固定集合中包含文档的最大数量。
**注意**: 在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
实例:
- 在 test 数据库中创建 runoob 集合
4.5 查看已有集合
语法:
show collections
或者
show tables
4.6 删除集合
语法
db.collection.drop()
返回值
- 如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false
4.7 插入文档
文档的数据结构和 JSON 基本一样。
所有存储在集合中的数据都是 BSON 格式。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
- 当我们向集合中插入文档时, 如果没有给文档指定
_id
属性, 则数据库会自动为文档添加_id
- 该属性用来作为文档的唯一标识 (primary key)
- 自动生成的
_id
属性不会重复, 自动通过时间戳 + 机器码生成 _id
属性可以自己指定, 如果已经手动指定了, 则不会再自动生成, 需要确保唯一性
语法:
使用 insert()
或 save()
方法向集合中插入文档
insert()
: 若插入的数据主键已经存在,则会抛异常,提示主键重复,不保存当前数据。save()
:如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃
db.COLLECTION_NAME.insert(<document>)
或
db.COLLECTION_NAME.save(<document>)
这里用 insert()
方法作为演示
- 向
test
数据库中的 ,stus
集合中插入一个新的学生对象
3.2 版本后新增方法 db.<collection>.insertOne()
和 db.collection.insertMany()
语法:
db.<collection>.insertOne(
<document>,
{
writeConcern: <document>
}
)
db.<collection>.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
参数说明:
document
: 要写入的文档writeConcern
: 写入策略, 默认为1, 即要求确认写操作, 0 是不要求ordered
: 指定是否按顺序写入, 默认是true
,按顺序写入
**注意**:insertOne()需要传入的是一个JSON对象, 而insertMany()则是一个包着JSON对象的数组
5. 查询语句
5.1 查询集合中所有文档
语法:
db.<collection>.find()
find()
用来查询集合中所有符合条件的文档find()
可以接受一对象作为条件参数, 不传则表示所有文档- 在
find()
方法后.pretty()
可将返回的数据格式化 find()
方法返回的是一个数组
5.2 运算符条件查询
操作 | 格式 | 范例 | mysql中类似语句 |
---|---|---|---|
等于 | {<key>:<value>} |
db.col.find( {"by":"菜鸟教程"} ).pretty() |
where by = '菜鸟教程 |
小于 | {<key>:{$lt:<value>}} |
db.col.find( {"linkes":{$lt:50} } ).pretty() |
where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} |
db.col.find( {"linkes":{$lte:50} } ).pretty() |
where likes <= 50 |
大于 | {<key>:{$gt:<value>}} |
db.col.find( {"linkes":{$gt:50} } ).pretty() |
where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} |
db.col.find( {"linkes":{$gte:50} } ).pretty() |
where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} |
db.col.find( {"linkes":{$ne:50} } ).pretty() |
where likes != 50 |
5.3 AND 查询
MongoDB的 find()
方法可以传入多个键(key), 每个键(key)以逗号隔开, 即常规SQL 的 AND 条件
语法:
db.<collection>.find({<key1>:<value1>},{<key2>:<value2>})
- 示例: 查询数据中所有
age < 38 AND gender = "女"
的数据
db.stus.find({"age":{$lt:38},"gender":"女"})
5.4 OR 条件
MongoDB OR 条件语句使用了关键字 $or
, 语法格式如下:
语法:
db.<collection>.find( {$or:[ {<key1>:<value1>} , {<key2><value2>} ]} )
- 示例: 查询
age = 38 OR name = 沙和尚
的数据
db.stus.find({$or:[{"age":38},{"name":"沙和尚"}]})
MongoDB学习笔记一(MongoDB介绍 + 基本指令 + 查询语句)的更多相关文章
- Mongodb学习笔记一(Mongodb环境配置)
Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...
- MongoDb 学习笔记(一) --- MongoDb 数据库介绍、安装、使用
1.数据库和文件的主要区别 . 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 . 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 ...
- MongoDB学习笔记(一) MongoDB介绍及安装(摘)
MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C++开发.Mongo的官方网 ...
- Mongodb学习笔记二(Mongodb基本命令)
第二章 基本命令 一.Mongodb命令 说明:Mongodb命令是区分大小写的,使用的命名规则是驼峰命名法. 对于database和collection无需主动创建,在插入数据时,如果databas ...
- MongoDB学习笔记(一) MongoDB介绍及安装
转自:http://database.51cto.com/art/201103/247882.htm http://baike.baidu.com/link?url=b6B3dVSCnQauCX-Ep ...
- Mongodb学习笔记四(Mongodb聚合函数)
第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...
- MongoDB学习笔记(六) MongoDB索引用法和效率分析
MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...
- MongoDB学习笔记-认识MongoDB
学习参考地址 http://www.runoob.com/mongodb NoSql 流行的数据库Oracle,SqlServer,MySql为关系性数据库,相对的,也有非关系性数据库,统称为NoSq ...
- MongoDB学习笔记~以匿名对象做为查询参数,方便查询子对象
回到目录 对于MongoDB的封装还在继续,对于不断追求简单的编程还在继续,对于喜欢代码的那么感觉,还在继续... 当你的mongo数据表里有子对象时,尤其是列表对象时,使用官方的驱动很是不爽,要记得 ...
随机推荐
- PAT乙级:1092 最好吃的月饼 (20分)
PAT乙级:1092 最好吃的月饼 (20分) 题干 月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种. 若想评比出一种"最好吃"的月饼,那势必在吃货界引发一场腥风 ...
- MYSQL时间戳和日期相互转换 笔记整理
相关函数: date_format(date, format) 函数,MySQL日期格式化函数date_format() unix_timestamp() 函数 str_to_date(str, fo ...
- [考试总结]noip模拟11
菜 这次考试又是骗了一堆分数... 然而其实一个正解都没写... \(T1\) 的方法说实话确实不是很正统.... 然而却 \(A\) 了... 在打完 \(T1\) 后拍了老长时间... 然后就耽搁 ...
- K8S系列第四篇(Dockerfile)
DokcerFile 镜像定制 更多精彩内容请关注微信公众号:新猿技术生态圈 定制docker镜像的方式有两种: 手动修改容器内容,导出新的镜像. 基于dockerfile自行编写指令,基于指令流程创 ...
- 前端构建第1篇之---引入elementUI
张艳涛 写于2021-1-19 HOW:如何引入elementui? 在项目根目录package.json引入,在重新执行npm install "dependencies": { ...
- frameset框架在.net网站中的小实现。
一般我们生成网页,为减少代码的开发量,通常将不变的网页部分进行重用.通用为三种方法: 1.frameset框架 2.用户自定义控件 3.母版页(消耗资源大,不追叙) 通常1,2两种方法常用. 1.fr ...
- Java的三种日期工具 Date Calendar SimpleDateFormat
三种日期工具 配合下面的案例可以更加深度的了解 Date 需要导包java.util.Date Date d = new Date(); //两种都是获取到现在时间的时间戳 long t1 = d.g ...
- 剑指 Offer 30. 包含min函数的栈
剑指 Offer 30. 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例 ...
- RHCSA_DAY09
常用特殊符号的使用 Linux系统下通配符起到了很大的作用,对于不确定的文档名称可以使用以下特殊字符表示 *常用的特殊符号,在文件名上,用来代表任意多个任意字符** ? 常用的特殊符号,在文件名上,用 ...
- 面试了一位33岁Android程序员,只会面向百度编程,居然要25k,脸呢?
最近逛论坛看到这样一个帖子: 面试了一位工作12年的程序员, 这位老哥有3年java开发经验,2年H5,7年Android开发经验,简历上写着精通Java,Android,熟悉H5开发.没有具体的技术 ...