什么是MongoDB
MongoDB是由C++语言编写,是一个基于分布式文件存储的开源数据库系统;高负载下,添加更多的节点,可以保证服务器性能
MongoDB为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值对组成;MongoDB文档类似于JSON对象;字段值可以包含其它文档,数组及文档数组
特点
MongoDB提供了一个面向文档存储,操作起来比较简单和容易
可以通过本地或者网络创建数据镜像,具有很强的扩展性
可以在记录中创建索引
支持丰富的查询表达式,查询指令使用JSON形式的标记,可以轻易查询文档中的对象及数组
如果需负载增加--存储或者计算能力,可以分布在其它节点
使用update()可以实现替换完整的文档数据或者一些指定数据字段
Map/reduce主要用来对数据进行批量处理和聚合操作
Map函数调用emit(key,value)遍历集合中的所有记录,将key和value传给reduce函数进行处理
map函数和reduce函数时使用javascript编写,可以通过db.runCommand或者mapreduce命令来执行mapreduce操作
GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件
可以编写服务端执行脚本,用jaascript编写某个函数,直接在服务端执行,也可以把函数定义存储在服务端,下次直接调用
支持各种编程语言
概念比较
SQL术语/概念 | MongoDB术语/概念 | 解释 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
数据库
一个mongodb可以建立多个数据库;mongodb的默认数据库为‘db’,该数据库存储在data目录中
mongodb的单个实力可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同数据库也放在不同的文件中,
使用show dbs 命令显示所有数据库
> show dbs
admin 0.000GB
local 0.000GB
test 0.000GB
执行db显示当前的数据库对象或集合
> db
test
使用use可以连接到指定的数据库,如果没有则创建之
> use local
switched to db local
> db
local
上边显示的数据库说明
admin:属于root数据库,如果一个用户添加到这个数据库,这个用户会自动继承所有数据库的权限。一些特定的服务端命令也只能在这个数据库unxing,比如列出所有数据库、关闭服务器
local:这个数据库不会被复制,可以用来存储仅限于本地单台服务器的 任意集合
config:当Mongo用于分片设置时,他用于数据库内部使用,来保存分片的相关信息
另外使用use db1创建数据库后,使用show dbs 显示数据库时候将默认不显示,需要插入一些内容
> use db1
switched to db db1
> db.c1.insert({"name":"china"})
WriteResult({ "nInserted" : 1 })
> show dbs;
admin 0.000GB
db1 0.000GB
local 0.000GB
删除数据库
> db.dropDatabase()
{ "dropped" : "db1", "ok" : 1 }
集合
集合就是MongoDB文档组,类似于RDBMS中的表格;集合存在于数据库中,没有固定的结构
当第一个文档插入到集合中时候,集合就被创建
> db.c2.insert({"name":"china"})
WriteResult({ "nInserted" : 1 })
查看集合
> show tables;
c1
c2
比如查看集合col的第一条记录
> db.c2.findOne()
{ "_id" : ObjectId("5958e3b2a6e810ff1933a6de"), "name" : "china" }
删除集合
> db.c2.drop()
true
> show tables;
c1
capped collections
他是固定大小的collection;具有很高的性能以及队列过期特性--过期按照插入的顺序;是高性能自动维护对象的插入顺序;非常适合记录日志的功能
和标准的collection不同,你必须要显式的创建一个capped collection,指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的
db.createCollection("mycol", {capped:true, size:100000})
文档
相当于行记录,文档时一组键值对-BSON,MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大区别
文档的数据结构和JSON基本一样;所有存储在集合中的数据都是BSON格式;BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON
一个文档例子
{"name":"jack","age":30}
一个插入集合中文档的例子,如果插入的集合不存在,自动创建,另外也可以定义文档变量插入
> db.c3.insert({name:'china',
... desc:'zhongguo'});
WriteResult({ "nInserted" : 1 })
> doc1=({name1:'usa',
... desc:'meiguo'});
{ "name1" : "usa", "desc" : "meiguo" }
> db.c3.insert(doc3)
2017-07-02T20:30:33.397+0800 E QUERY [thread1] ReferenceError: doc3 is not de
fined :
@(shell):1:1
> db.c3.insert(doc1)
WriteResult({ "nInserted" : 1 })
> db.c3.find()
{ "_id" : ObjectId("5958e72ea6e810ff1933a6df"), "name" : "china", "desc" : "zhon
gguo" }
{ "_id" : ObjectId("5958e76fa6e810ff1933a6e0"), "name1" : "usa", "desc" : "meigu
o" }
更新文档,如果是更新所有文档,添加multi:true条件
> db.c3.update({'name':'china'},{$set:{'title':'zhongg'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.c3.update({'name':'china'},{$set:{'title':'zhongg'}},{multi:true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
替换文档
> db.c3.find()
{ "_id" : ObjectId("5958e72ea6e810ff1933a6df"), "name" : "china", "desc" : "zhon
gguo", "title" : "zhongg" }
{ "_id" : ObjectId("5958e76fa6e810ff1933a6e0"), "name1" : "usa", "desc" : "meigu
o" }
> db.c3.save({"_id" : ObjectId("5958e72ea6e810ff1933a6df"),'name':'aaa'})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.c3.find()
{ "_id" : ObjectId("5958e72ea6e810ff1933a6df"), "name" : "aaa" }
{ "_id" : ObjectId("5958e76fa6e810ff1933a6e0"), "name1" : "usa", "desc" : "meigu
o" }
删除文档,其中后边的1代表删除找到文档第一条,否则删除所有匹配文档
> db.c3.remove({'name':'aaa'},1)
WriteResult({ "nRemoved" : 1 })
> db.c3.find()
{ "_id" : ObjectId("5958e76fa6e810ff1933a6e0"), "name1" : "usa", "desc" : "meigu
o" }
删除所有文档
> db.c3.remove({})
WriteResult({ "nRemoved" : 1 })
> db.c3.find()
RDBMS和MongoDB服务客户端对照
数据库服务和客户端 | |
Mysqld/Oracle | mongod |
mysql/sqlplus | mongo |
注意:
文档中的键值对是有序的
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)
MongoDB区分类型,大小写
文档不能有重复的键
元数据
数据库的信息是存储在集合中。使用了系统的命名空间
dbname.system.*MongoDB数据类型那个列表,常用
数据类型 | 描述 |
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Arrays | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |