1. 文档
文档是mongodb的核心概念。就是键值对的一个有序集,其他语言中hash、map、dictionary。
文档的键的要求:
键不能包含\0(空字符),代表着键结束
.和$有特殊意义,是被保留的,不能使用。
mongodb不但区分类型,还区分大小写。
文档不能有重复的键。
文档中的键/值是有序的:{“x”:1,“y”:2}和{“y”:2,“x”:1}
是不同的。通常,字段顺序不重要,某些情况下会非常重要。
2. 集合
集合就是一组文档,相当于关系型数据库中的一张表。
集合是动态模式的,集合里面可以放任何文档,类型甚至键集合之间都可以不同。
命名
集合名称不能是空字符串
集合名称不能包含\0
集合名称不能以system.开头,这是系统集合保留的前缀
不能包含保留字符'$'
子集合
组织集合的一种管理是使用“.”分隔不同命名空间的子集合,例如博客功能的两个集合:blog.posts和blog.authors。
3.数据库
多个文档组成数据库。一个mongodb的实例可以承载多个数据库。每个数据库有独立的权限,不同的数据库也放置在不同的文件夹中。
命名
不能为空字符串
不能包含特殊字符。基本上只能使用ASCII中的字母和数字
区分大小写,应全部小写。
最多为64个字节
保留的库名
admin:这是root数据库,将一个用户添加到admin数据库中,这个用户将获得所有数据库的权限
local:这个数据库不可以复制,一台服务器中的本地集合都可以存储在这个数据库中
config:分片信息存储在config数据库中
数据库名添加到集合名前,得到集合的完全限定名,即命名空间(namespace)。例如cms数据库中的blog.posts。则命名空间为cms.blog.posts。命名空间不得超过121字节。
4.启动
mongod
bin/mongod --fork --config /usr/local/mongodb-3.2.6/etc/mongod.conf
mongod没有参数的情况下,会使用默认的数据目录/data/db,如果目录不存在或者不可写,会启动失败。
启动时候默认监听27017端口。还会启动一个http服务器,监听数字比主端口号大1000,即28017。2.6以后的mongo都是关闭的,启动的时候加入--httpinterface开启。这里有详细的解释
5.shell
mongo
bin/mongo --host 192.168.253.XXX --port 27000
mongo 192.168.253.XXX:27000/myDB
shell是个功能完备的JavaScript解释器,可以运行任意JavaScript程序。
默认连接的是test数据库。
不连接数据库:
mongo --nodb
需要连接的数据之后:
conn=new Mongo("192.168.253.XXX:27000)
db=conn.getDB("myDB")
db
查看当前链接的数据库
5.1 help
help
查看帮助文档,db.help()查看数据库级别的帮助,db.foo.help()查看集合级别的帮助。
如果想知道一个函数做什么用的,可以直接在shell中输入函数名,例如:db.foo.update
5.2 使用shell执行脚本
mongo script1.js script2.js
mongo会依次执行,执行完成之后然后退出。
如果你想在指定的主机跟端口上执行:
mongo --quiet server:27000/myDB script1.js
这样mongo将指向server:27000上的myDB数据库执行脚本。需要注意的是,指定的命令行需要在server之前。--quiet选项,可以不让mongo打印欢迎标志
load("script1.js")
load("/data/kyle/script1.js")
在交互式shell中运行脚本。load函数无法解析~字符。
5.3 .mongorc.js文件
某些脚本会被频繁加载,可以在用户的主目录下(cd ~)创建mongorc.js文件,并将脚本加入其中。
.mongorc.js常见的用途是移除比较危险的函数:、
var no = function(){
print("Not on my watch");
}
db.dropDatabase=DB.prototype.dropDatabase=no;
可以在启动的时候加入选项--norc,禁止加载.mongorc.js
5.4 定制shell
将prompt变量设为一个字符串或者函数,就可以重写默认的shell提示。
prompt=function(){
return (new Date())+"> ";
}
prompt=function(){
if(typeof db=='undefined'){
return '(nodb)> ';
}
try{
db.runCommand({getLastError:1})
}catch(e){
print(e)
}
return db+"> ";
}
5.5 集合命名的注意事项
如果集合名称中包含保留字或者无效的js属性名称,那么db.collectionName将不能正常 工作。
db.version:返回当前数据库的名称
如果你有一个version的集合,那么你需要用getCollection函数。
db.getCollection("version")
一个访问数组的方法:
var collections=["A","B","C"]
for(var i in collections){
print(db.blog[i]])
}
不能使用db.blog.i
一些诡异的名字的集合也可以这样访问
var name = "@#lala"
db[name].find();
直接使用db.@#lala进行查询是非法的
6.数据类型
null
布尔型:true,false
数值,默认使用的是64位浮点类型
字符串
日期:新纪元以来的毫秒数。创建的时候使用
new Date()
,而非Date()
正则
数组
内嵌文档
对象id:一个12字节的唯一标示
二进制
代码:可以包含js代码。
mongo的文档必须有一个"_id"的键,这个键的值可以使任何类型的,默认是一个ObjectId对象。
一个集合里面,每个文档的都有唯一的"_id"。
-
ObjectId
分布式数据库,能在分片环境中生成唯一标识符非常重要。
ObjectId的12个字节按照下面的方式排列。
前四个字节是从标准纪元开始的时间戳,单位为秒
由于时间戳在前,这意味着ObjectId大致会按照插入的顺序排列
4-6,是所在主机的唯一标示,通常是机器名的散列
pid为了确保同一台机器并发的多个进程产生的ObjectId的唯一性
最后三个字节是一个自动增加的计数器
2. _id
如果插入文档的时候没有“_id”键,系统会自动创建,这个通常是由客户端的驱动程序完成的