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"。

  1. ObjectId

    分布式数据库,能在分片环境中生成唯一标识符非常重要。
    ObjectId的12个字节按照下面的方式排列。

    clipboard.png

  • 前四个字节是从标准纪元开始的时间戳,单位为秒

  • 由于时间戳在前,这意味着ObjectId大致会按照插入的顺序排列

  • 4-6,是所在主机的唯一标示,通常是机器名的散列

  • pid为了确保同一台机器并发的多个进程产生的ObjectId的唯一性

  • 最后三个字节是一个自动增加的计数器

 2. _id

如果插入文档的时候没有“_id”键,系统会自动创建,这个通常是由客户端的驱动程序完成的

kyle
23 声望4 粉丝