MongoDB Concept

数据库

MongoDB能够承载多个数据库,一个数据库可以包含0个或多个集合。每个数据库都有独立的权限,每个数据库也存放在不同文件上。MongoDB数据库通过名称来标识,数据库名可以是满足以下条件的任意UTF-8字符串:

  • 不能是空字符串
  • 不能含有/、\、.、"、*、<、>、:、|、?、$、空格、\0。基本上只能使用ASCII中的字母和数字
  • 数据库名称区分大小写
  • 数据库名称最多为64字节

另外MongoDB中还包含几个系统数据库,需要了解它的作用

  • admin:添加到admin数据库的用户自动获得所有数据库的权限。同时也可以运行一些特定命令,如列出所有数据库、关闭服务器。
  • local:本地集合数据库,在副本集或分配环境无法被复制
  • config:用于分片设置,分片信息会存在config数据库中

查看当前数据库

> db
test

切换数据库

> use admin

创建数据库

>db.createCollection(database)

当我们use切换到一个不存在的数据库中,并创建集合,数据库会一同创建

文档

文档即一组键值对的有序集,文档中的值可以是多种不同类型的数据类型,甚至是一个内嵌文档。文档的键是字符串,键通常可以是任意UTF-8字符,但需要注意以下两点:

  • 键不能含有\o(空字符),这个字符表示键的结尾
  • . 和 $具有特殊意义,只能在特定环境下使用,通常只作为保留

MongoDB不但区分类型还区分大小写。例如,下面两个文档是不同的

{"foo":3}
{"foo":"3"}

文档中的键值对是有序的,{"X":1,"Y":2}和{"Y":2,"X":1}两个是不同的。MongoDB文档不能有重复的键

集合

集合就是一组文档,集合是动态模式的,这意味着集合内的文档可以是各式各样的。集合名称也存在一定的要求

  • 集合名不能为空字符串
  • 集合名不能包含\0字符
  • 集合名不能以"system."开头,这是为系统集合保留的前缀。
  • 用户创建的集合不能包含保留字符"$"

组织集合常用的惯例就是通过"."来分隔不同命名空间的子集合。例如博客系统的blog.posts和blog.categories。使得组织结构更清晰,系统中GridFS也采用了子集合的形式。

db.collectionName可以获取一个集合的内容,如果集合名称中包含保留字或者无效的javascript属性名称,db.collectionName就不能正常工作了,这时可以采用db.getCollection("collectionName")来获取,也可以使用数组访问法,x.y等价于x['y']。

固定集合

固定集合,顾名思就是固定大小的集合,向一个插满的固定集合插入新数据,将会将最老的数据先给删除,如此循环往复。固定集合数据顺序写入,因此写入速度很快,oplog日志则就是采用固定集合。

db.createCollection("mycoll",{"capped":true,"size":10000});

size为固定集合的大小,单位为字节,除了大小,还可以通过max选项指定集合中的文档数量。另外,我们也可以将普通集合转换为固定集合,通过convertToCapped实现。

db.runCommand({"convertToCapped":"test","size":10000});

无法将固定集合转换为普通集合

数据类型

MongoDB文档与Javascript对象相近,采用了类似于JSON格式的BSON格式,其支持下列数据类型

  • null:null用于表示空值或者不存在的字段
  • Boolean:布尔类型包含true和false两个值
  • 数值:shell默认使用64为浮点数数值
  • 字符串:UTF-8字符串都可表示为字符串类型的数据
  • 日期:日期被存储为自新纪元以来经过的毫秒数,不存储时区
  • 正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript相同
  • 数组:数据列表或数据集可以表示为数组,数组可以包含不同数据类型的元素
  • 内嵌文档:文档可嵌套其它文档,被嵌套的文档作为父文档的值
  • 对象id:文档必须有一个_id键作为唯一标识,这个键的值可以是任何类型的,默认是个ObjectId对象,它使用12个字节的存储空间,是一个24个十六进制数字组成的字符串,前四个字节为时间戳,单位为秒,后三位为机器的唯一标识,由主机名散列值生成,再后两位为PID进程标识符,最后三个字节是一个自动增加的计数器
  • 二进制数据:二进制数据是一个任意字节的字符串,它不能直接在shell中使用,如果要将非UTF-8字符保存到数据库中,二进制数据是唯一的方式。

MongoDB Shell

MongoDB Shell是MongoDB自带的Javascript Shell,支持完整的javascript,同时可作为MongoDB的客户端。可以通过mongo命令进入MongoDB Shell,如果对Shell中的命令不太熟悉,可以通过db.help()查看数据库帮助信息或者通过db.[collection].help()查看集合的帮助信息。如果要查看函数的实现代码或参数顺序可以通过不加括号来获取,例如想查看insert函数,就可以输入db.[collection].insert来获取

在交互方式与脚本化之间部分命令存在差异,例如脚本中不能采用use db或show collections命令,具体如下:

Shell Helpers Javascript
show dbs,show databases db.adminCommand('listDatabases')
use <db> db=db.getSiblingDB('<db>')
show collections db.getCollectionNames()
show users db.getUsers()
show roles db.getRoles(showBuiltinRoles:true)
show log <logname> db.adminCommand({'getLog':'<logname>'})
show logs db.adminCommand({'getLog':'*'})
it cursor=db.collection.find() if (cursor.hasNext()){ cursor.next();}

我们可以通过--eval参数直接返回命令结果:

mongo --eval "db.getCollectionNames()"

我们也可以直接执行js脚本:

mongo --quiet scripts1.js scripts2.js

或者直接在shell中加载js脚本,当前的查找目录可以通过run("pwd")调用系统命令查看

load(scripts1.js)

我们还可以将脚本变量注入到shell中。例如,可以在脚本中简单创建一些常用的辅助函数
,下面定义了一个connctTo()的函数,它连接到指定端口的本地数据库

var connectTo = new function(port,dbname) {
  if (!port) {
    port=27017;
  }
  if(!dbname) {
    dbname="test";
  }
  db = connect("localhost:"+port+"/"+dbname);
  return db;
}

通过load('connectTo.js')来加载辅助函数

.mongorc.js

.mongorc.js是在Shell启动时自动加载的一个脚本,可以用于一些提示或者危险命令重定向的用途。例如禁用dropDatabase或者deleteIndexes命令

var no = function() {
  print("Not on my watch");
}

db.dropDatabase = DB.prototype.dropDatabase = no;
DBCollection.prototype.drop = no;
DBCollection.prototype.dropIndex = no;

定制shell提示格式

prompt = function() {
  if (typeof db == 'undefined') {
     return '(nodb)> ';
  }

  try {
     db.runCommand({getLastError:1});
  }
  catch (e) {
     print(e);
  }
  return db+"> ";
};

在shell中编辑多行时无法编辑之前的行,可以配置shell采用外部编辑器。在.mongorc.js最后添加:

EDITOR = /usr/bin/vi

例如编辑一个变量,可以使用edit命令

var hello = db.code.findOne({title:"hello world"})
edit hello

edit编辑完保存退出,变量就会被重新解析加载到shell中

连接MongoDB

MongoDB Shell使用mongo提供两种格式来连接数据库,一种是URI的方式,一种是参数选项

URI

mongo mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
  • username:password:如果MongoDB启用了认证登陆,则需要输入相应的用户名和密码
  • host:port :指定要连接的IP和端口,如果是副本集则需要输入多个节点
  • database:连接并验证登陆指定的数据库,如果不指定默认打开test数据库
  • ?options:连接选项,key-value形式,以&分隔

参数选项

mongo host:port -u username -p password --authenticationDatabase admin

--authenticationDatabase为指定的用户认证数据库

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

推荐阅读更多精彩内容

  • 这里是阅读了《MongoDB权威指南》后做的相关笔记。 一、文档 文档是MongoDB的核心概念。文档就是键值对的...
    yjaal阅读 646评论 0 4
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,938评论 2 89
  • MongoDB是一个开源、高性能、无模式的文档型数据库,是NoSQL产品中的一种。 MongoDB中记录的是一个文...
    dev_winner阅读 288评论 0 1
  • mogon简介 MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可...
    猪哥亮阅读 2,001评论 0 10
  • MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源非关系数据库系统(NoSQL)...
    苟且_7c59阅读 252评论 0 0