MongoDB入门+面试题

313 阅读2分钟

1.简介

由c++编写,基于分布式文件存储的数据库系统,(来自于英文单词“Humongous”,中文含义为“庞大”)。

Mongodb将数据存储为一个文档,数据结构由键值(key=>value)对组成。

BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

优势:

  • 快。nosql基于内存设计,(主要原理:将热数据存在物理内存中,提高整体查询速度)。
  • BJSON。格式简单,易读。
  • 高拓展性。复制,分片。
  • 持久化在硬盘。开启journal,刷盘间隔100ms,每次写入会记录一条操作日志。

2.概念

1.数据库

一个mongodb中可以建立多个数据库。默认库为"db",存储在data目录中。

保留数据库名,特殊作用数据库:

  • admin:权限角度来看,这是个"root"数据库。将用户添加到该库中,这个用户自动继承所有数据库权限。
  • local:这个数据永远不会被复制,可以用来存储限于本地服务器的任意集合。
  • config:当Mongdb用于分片设置时,config数据库在内部使用,用于保存分片相关的信息。

2.文档

文档是一组健值(key-value)对(即BSON)。Mongdb文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型。

  • 文档中的键值对是有序的。
  • 文档中的值不仅可以是双引号中的字符串,还可以是其他数据类型。
  • 区分类型和大小写。
  • 文档中不能有重复的键。

规范:

  • 不能含有\0(空字符串)。
  • .和$只能在特定的环境下使用。
  • 以下划线_开头的键是保留的。

3.集合

集合是Mongodb文档组。没有固定的结构,通常情况下我们插入集合的数据都会有一定的关联性。

当第一个文档插入时,集合就会被创建。就是说集合后要再插入一个文档,集合才真正创建。

capped collections:

  • 固定大小的collection。
  • 高性能自动的维护对象的插入顺序,适合类似记录日志的功能。
  • 必须显示的创建一个capped collection,指定大小,单位是字节,提前分配存储空间。
  • 按照文档插入顺序保存在集合中,而不是以索引确定插入数据,提高增添数据的效率。

4.元数据

数据库的信息是存储在集合中。他们使用了系统的命名空间:

dbname.system.*

5.Mongdb数据类型

常用:String,Integer,Boolean,Double,Array,Object ID,时间戳。

Object ID:类似唯一主键。Mongdb文档必须有一个_id健。可以为任何类型,默认是Object ID对象。时间戳可以从该字段中获取。由:时间戳、客户端ID、客户进程ID、三个字节的增量计数器组成。


3.命令

命令说明备注
show dbs显示所有数据库列表
use [数据库名]如果不存在创建,存在则连接到指定数据库
db显示当前数据库对象和集合
db.dropDatabase()删除数据库步骤: 切换数据库->执行删除命令
db.createCollection(name,options)创建集合(name:集合名称,options:可选参数,指定内存大小及索引的选项)
db.collection.drop()删除集合
....
db.collection.createIndex(keys, options)创建索引(keys:索引字段、options:1升序、-1降序创建索引)

4.复制(副本集)

复制是将数据同步在多个服务器的过程。

原理

复制至少需要两个节点。主节点:负责处理客户端请求,其余都是从节点,负责复制主节点的数据。搭配方式:一主一从、一主多从。

主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的副本执行该操作。

MongoDB复制结构图

副本集特征:

  • N 个节点的集群

  • 任何节点可作为主节点

  • 所有写入操作都在主节点上

  • 自动故障转移

  • 自动恢复


5.分片

相当于另一种集群,可以满足Mongodb大量增长的需求。通过在多台服务器上分割数据,使数据库系统可以存储更多的数据。

img

上图中主要有如下所述三个主要组件:

  • shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组一个replicas set承担,防止主机单点故障。
  • Config Server:mongdb实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
  • query Routers:前端路由,客户端由此接入。且让整个集群看上去像单一数据库,前端应用可以透明使用。

6.Mongdb Java(springBoot整合)

maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.0.1.RELEASE</version>
</dependency>

配置文件:

#mongodb配置
spring.data.mongodb.uri=mongodb://ip地址:27017/库名

mongoTemplate:

常用方法:

mongoTemplate.insert(student) //新增
mongoTemplate.findAll(Student.class); //查询Student文档的全部数据
mongoTemplate.findById(<id>, Student.class); //查询Student文档id为id的数据
mongoTemplate.find(query, Student.class); //根据query内的查询条件查询
mongoTemplate.upsert(query, update, Student.class); //修改
mongoTemplate.remove(query, Student.class); //删除

Query对象:

//创建Query对象,创建Criteria
Query query = new Query();
//精准条件
Criteria.where("key").is("条件")
//模糊条件
Criteria.and("key").regex("条件")		
//封装
query.addCriteria(criteria)

GUI:

MongoDB Compass Community


7.MongoDB关系

  • 嵌入式关系
{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address": [
      {
         "building": "22 A, Indiana Apt",
         "pincode": 123456,
         "city": "Los Angeles",
         "state": "California"
      },
      {
         "building": "170 A, Acropolis Apt",
         "pincode": 456789,
         "city": "Chicago",
         "state": "Illinois"
      }]
} 

一次查询

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
  • 引用式关系
{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

两次查询,先查地址id,再根据地址id查对应地址

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})

8.面试题

mongoing.com/archives/do…