MongoDB概念:
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,属于文档数据库(No SQL)Not Only Sql 是非关系数据库当中功能最丰富、最像关系数据库的。由于关系型数据库存储对数据之间存在高度的关联,在数据量达到上万亿比特时,关系型数据库所特有的约束和关联就会成为性能瓶颈。非关系型数据库采用了另一种思维方式,即不考虑数据之间千丝万缕的联系,存储也不需要固定的模式,这样无需多余的操作就能成倍地扩展数据量。
MongoDB采用的数据格式是类似于Json格式的Bson格式可以简单理解为Json的增强版本。
{
title: 'Mongo',
body: 'Mongo基础入门',
by: 'xiaojun',
}
MongoDB数据库安装:
此部分省略,参照官方文档即可。测试成功之后,在命令行中输入mongo。在服务中查找MongoDB的服务。
MongoDB基本概念:
1、数据库:
一个 MongoDB 可以创建多个数据库
使用 show dbs 可以查看所有数据库的列表
执行 db 命令则可以查看当前数据库对象或者集合
运行 use 命令可以连接到指定的数据库
Case 1:
$ mongo # 进入到mongo命令行
> use test # 连接到test数据库
2、集合:集合就是一组文档的组合,就相当于是关系数据库中的表,在 MongoDB 中可以存储不同的文档结构的文档。可以类比关系型数据库的数据表。一个数据库中可以包含多个集合。
Case:
{"company":"IBM"} {"people":"zhongrun@cn.ibm.com","name":"Jerry"}
上面两个文档就可以存储在同一个集合中,在关系型数据库中是很难实现上述数据结构的,要么需要定义大量的字段,对于一些字段名不确定的属性,关系型数据库会更加力不从心。
MongoDB 的做法也不是完美的。比如在存储用户信息的时候,用户名和密码分别用 username 和 password 字段表示。 关系型数据库只需要把字段名作为表结构的一部分保存起来就可以了,而 MongoDB 需要将这两个字段名存储多次,每一条记录都会存储一次字段名,在一些原本就比较碎片化的字段上,用于存储字段名所耗费的空间甚至会超过存储数值的空间,比较好的解决办法是采用尽可能短的字段名,不过这又涉及到了可读性的问题,需要大家在二者之间进行权衡。
3、文档:文档的概念类比RDBMS就是实际的记录,是 MongoDB 的核心,类似于 Mysql 数据库(关系数据库)中的每一行数据。多个键及其关联的值放在一起就是文档。在 Mongodb 中使用一种类 json 的 bson 存储数据,bson 数据可以理解为在 json 的基础上添加了一些 json 中没有的数据类型。
Case:
# user文档
{
"name": "Tony",
"contact": "78718273",
"dob": "01-01-1991"
}
# address文档
{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Dalian",
"state": "Dandong"
}
文档关系:
(1)嵌入式关系:
# 这就是嵌入式的关系 address嵌入到user之中
{
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991",
"address":
[{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "chengdu",
"state": "sichuan"
},
{
"building": "170 A, Acropolis Apt",
"pincode": 456789,
"city": "beijing",
"state": "beijing"
}]
}
(2)引用式关系:将两个文档分开,通过引用文档的_id 字段来建立关系;
# 这就是引用式关系
{
"name": "JerryXin",
"contact": "85189291",
"dob": "01-01-1991",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000") #对应address文档的id字段
]
}
在实际应用的时候,嵌入式关系比较适合一对一的关系,引用式关系比较适合一对多或者多对多的情况。
MongoDB元数据:
数据库的信息存储在集合中,他们统一使用系统的命名空间:DBNAME.system.*。
常见参数使用介绍:
DBNAME 可用 db 或数据库名替代:
DBNAME.system.namespaces :列出所有名字空间
DBNAME.system.indexs :列出所有索引
DBNAME.system.profile :列出数据库概要信息
DBNAME.system.users :列出访问数据库的用户
DBNAME.system.sources :列出服务器信息
数据库创建与删除:
数据库创建:
use mydb #创建数据库mydb
数据库查看:
show dbs
列出的所有数据库中看不到 mydb 或者显示 mydb(empty) ,因为 mydb 为空,里面没有任何东西,MongoDB 不显示或显示 mydb(empty)。
数据库删除:
> use local
switched to db local
> db.dropDatabase()
可以发现 local 数据库已经被删除了。
集合创建与删除
在数据库创建集合:
> use mydb
switched to db mydb
> db.createCollection("users")
查看已经创建的集合:
> show collections
删除集合:
> show collections
> db.users.drop()
进行操作验证,查看当前的使用的数据库的所有集合:
> show collections
向集合之中进行插入数据:
1、使用insert()
Case:
> use mydb
switched to db mydb
> db.users.insert([
... { name : "jerry",
... email : "jerry@qq.com"
... },
... { name : "tom",
... email : "tom@qq.com"
... }
... ])
2、使用save()
> use mydb2
switched to db mydb2
> db.users.save([
... { name : "jam",
... email : "jam@qq.com"
... },
... { name : "tom",
... email : "tom@qq.com"
... }
... ])
insert和save的区别:
为了方便记忆,可以先从字面上进行理解,insert 是插入,侧重于新增一个记录的含义;save 是保存,可以保存一个新的记录,也可以保存对一个记录的修改。因此,insert 不能插入一条已经存在的记录,如果已经有了一条记录(以主键为准),insert 操作会报错,而使用 save 指令则会更新原记录。
小节:在 MongoDB 中使用一种类 json 的 bson 存储数据,可以使用 use 创建和切换数据库,show dbs 可以查看有哪些数据库,dropDatabase 可以删除数据库,createCollection 可以创建集合,show collections 可以查看集合,insert() 和 save() 可以插入数据。