MongoDB Base

下载地址 https://www.mongodb.com/download-center

MongoDB是CS架构的,使用前需启动服务端。

启动服务端

  • mongod run 直接启动
  • mongod --dbpath=DBPATH 指定特定数据存储目录启动,若目录不存在则创建。
  • mongod --logpath=LOGFILE 指定特定日志文件
  • mongod --dbport=DBPORT 指定特定端口启动,默认27017.

Wins中默认数据存放目录 C:\data\db
Linux中默认数据存储目录 /data/db

启动服务端时指定存储目录并启动

  • 将MongoDB作为Windows服务随机启动
$ mongod --dbpath=D:\data\db --logpath=D:\data\log\mongodb.log --dbport=27017 --install
Error parsing command line: unrecognised option '--dbport=27017'
try 'mongod --help' for more information

先要创建对应的db目录和log目录

$ mongod --dbpath=D:\data\db --logpath=D:\data\log\mongodb.log --port=27017 --install
2019-12-24T17:01:32.976+0800 F  CONTROL  [main] Failed global initialization: FileNotOpen: Failed to open "D:\data\log\mongodb.log"

查看日志文件

Error connecting to the Service Control Manager: 拒绝访问。 (5)

cmd没有用管理员权限

$ mongod.exe --bind_ip 127.0.0.1 --logpath "D:\data\log\mongodb.log" --logappend --dbpath "C:\data\db" --serviceName "Mongodb" --serviceDisplayName "MongoDB" --install

进入CMD使用services.msc打开服务找到MongoDB,设置服务状态。

  • 将MongoDB作为Linux服务随机启动
# 创建mongodb日志文件
> touch /var/logs/mongodb.log

# mongodb随机启动
> vi /etc/rc.local
mongod --dbpath=/var/data/db --dblog=/var/logs/mongodb.log --dbport=27017

# 客户端连接
> mongo

浏览器输入 http://127.0.0.1:27017

It looks like you are trying to access MongoDB over HTTP on the native driver port.

请求与连接

MongoDB数据库会为每个连接创建一个队列,存放该连接的请求。当客户端发送一个请求会被放到队列末尾。只有队列中的请求都执行完毕,后续的请求才会执行。所以从单个连接就可以了解整个数据库,并且它总是能读到自己写的东西。

每个队列都有独立的,打开两个shell就有两个数据库连接。在一个shell中执行插入之后在另一个查询,不一定能得到插入的文档。然而,在同一个shell中,插入后再进行查询是一定能查询到的。在繁忙的服务器上,交错的插入或查询显得稀松平常。当开发者用一个线程插入数据,用另一个线程检查是否成功插入时,会经常遇到这种问题。有那么一两秒时间好像根本就没插入数据,但随后数据又突然冒出来。

使用Ruby、Python、Java驱动程序时,要特别注意这种行为,因为语言的驱动都使用了连接池。为提高效率,驱动程序和服务器建立了多个连接(连接池),并将请求分散到这些连接中,好在它们都提供了一些机制来确保一系列的请求都由一个连接来处理。

体系结构

一个运行着的MongoDB数据库可看成是一个MongoDB Server,该Server由实例和数据库组成。数据库是由一系列与磁盘相关的物理文件。

数据逻辑结构

MongoDB 数据逻辑层次结构 - 由 database 组成,databasecollections 组成,collectionsdocuments 组成,而 documentsfields 组成。

MongoDB 数据逻辑层次结构

数据存储结构

MongoDB默认数据目录为 /data/db,它负责存储所有MongoDB的数据文件。

MongoDB在Windows中的数据存储结构

预分配空间

MongoDB内部有预分配空间的机制,每个预分配的文件都用0填充,使MongoDB始终保持额外的空间和空余的数据文件,从而有效地避免了由于数据暴增而带来的磁盘压力过大的问题。

由于表中数据量增加,数据文件每次分配一次,其大小都会是上一个数据文件大小的2倍 ,每个数据文件最大2G。预分配机制有利于防止较小的数据库浪费过多的磁盘空间,同时又保证较大的数据库又响应的预留空间使用。

表命名空间

数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间,这些命名空间的元数据都集中在 *.ns 文件中。

基本概念

文档

每种编程语言表示文档的方式不同,多个键及其关联的值有序地对应组织是文档,例如映射、散列、字典等,在JS中对象即文档。

  • 文档的键值对是有序的
  • 文档的值可使用任意UTF-8字符,其数据类型是多样的。
  • 文档不能存在重复的键

集合

集合即一组文档,集合是无模式的,意味着集合中的文档可以是各样的。那么为什么要使用多个集合呢?

  • 在集合中查询特定类型的文档的速度
  • 同种类型的文档放在一个集合中,数据更加集中。
  • 创建索引时,文档会附加结构。索引是按集合来定义的,同种类型的文档放在同一个集合中,使得索引更加有效。

数据库

多个集合组成数据库,一个数据库实例可承载多个数据库,数据库之间可视为完全独立。
每个数据库都有独立的权限控制,即便在磁盘上不同数据库也放置在不同的文件中,数据库最终变成文件系统里的文件。

shell

MongoDB自带JS shell以便于从命名行与数据库实例交互,shell是一个独立MongoDB客户端。shell中的基础操作CURD:创建、读取、更新、删除。

> post = {title:'ipost', content:'here is blog post', date:new Date()};
> db.blog.insert(post);
> db.blog.find();
> db.blog.findOne();

> post.comments = [];
> db.blog.update({title:'ipost'}, post);
> db.blog.find();

> db.blog.remove({title:'ipost'});
MongoDB

NoSQL

NoSQL(Not Only SQL)非关系型数据库,其特点是非关系型、分布式、开源、水平扩展。NoSQL使用最多的当属key-value存储,当前还有文档型、列存储、图形数据库、XML数据库等。

Memcached和Redis是key-value型数据库,即通过key指向value并通过hash算法关联以达到高效的查询效率。MongoDB是文档数据库,存储的是BSON(JSON的二进制化)。其内部执行引擎为JS解释器,将文档存储为BSON结构,转换为JS对象。

MongoDB与传统型数据库相比较,传统型数据库存储的是结构化数据,定义好表结构后每行数据必须符合列的个数和类型。

MongoDB没有模式,文档的键不会事先定义也不会固定不变,由于没有模式需要更改,通常无需迁移大量数据。不必将所有数据都放到一个模子中,应用层可处理新增或丢失的键,开发者可非常容易地变更数据库模型。

安装

http://www.mongodb.org
工具集

  • bsondum 导出后bson结构
  • mongo 客户端
  • mongod 服务端
  • mongodump 导入备份
  • mongorestore 数据恢复
  • mongos 路由器,分片时使用。

启动服务端

mongos --help

mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017

参数

--dbpath 数据库存放目录,每个数据库会在其中创建一个子目录,用于防止同一个实例多次运行,mongod.lock 也保存在次目录下。
--logpath 数据库日志存放目录,错误日志文件
--port 服务端口默认27017
--fork 以后台进程即Daemon方式启动
--logappend 错误日志采用追加模式,默认为覆写模式。
--bind_ip 对外服务的绑定IP
# 查看磁盘空间
df -h

# 启动数据库
mongod --dbpath /home/mongo/database --dblog /home/mongo/db.log --fork=27017 --port 27017

# 查看服务进程
ps -aux|grep mongo

配置文件方式启动

# 读取启动配置文件的方式来启动数据库
cat /etc/mongodb.conf
dbpath = /data/db
# 写入配置
mongod -f /etc/mongodb.conf

关闭数据库

直接通过在admin库中发送db.shutdownServer()来停止MongoDB实例。

db.shutdownServer()

也可杀死数据库实例的进程

ps aux | grep mongod
# 不用使用 kill -9 PID来杀死MongoDB会导致MongoDB的数据损坏。
kill -2 PID
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341