文档
- 键值对的一个有序集
- 文档被表示为对象
- 文档必须有一个
_id
键
{"greeting" : "Hello, world!"}`
键
- 文档的键是字符串
- 区分类型和大小写
- 不能含有空字符(\0)
-
.
和$
是保留字 - 不能由重复的键
- 键/值对是有顺序的
集合
- 一组文档
- 动态模式: 一个 集合里的文档可以是多样;
命名
- 集合名不能是空字符串;
- 不能包含空字符(\0);
- 不能以
system
开头; - 不能包含保留字符
$
子集合
- 集合用
.
分隔不同命名空间的子集合
数据库
- 多个集合可以组成数据库
命名
- 不能是空字符串
- 基本上只能使用ASCII中的字母和数字
- 区分大小写,简单来将,应该都用小写
- 最多64字节
- 如果不创建数据库直接创建集合,会默认在
test
数据库中
保留数据库
-
admin
: 这是一个root数据库,如果将一个用户添加到此数据库,将自动获得所有数据库的权限;一些特定服务器端命令也只能从admin
数据库运行 -
local
:这个数据库永远不可复制,一台服务器上的所有本地集合都可以存储在这个数据库中 -
config
:mongodb
用于分片设置时,分片信息会存储在此数据库
启动
-
mongod
在没有参数的情况下会使用默认数据目录:/data/db
- 默认监听接口:
27017
数据类型
null
- 布尔值
- 数值:默认64位浮点值;对于整数值,可使用
NumberInt
(表示4字节带符号整数),NumberLong
(表示8字符带符号整数)
{"x": NumberInt("3")}
{"x": NumberLong("3")}
字符串类型
日期:
{"x": new Date()}
正则表达式:
{"x":/foobar/i}
数组
内嵌文档:
{"x":{"foo":"bar"}}
-
_id
是一个12字节的ID,默认类型ObjectId
:{"x":objectId()}
如果插入文档时没有 "_id" 键,系统会自动创建一个;
由 24 个十六进制数字组成的字符串;
-
ObjectId 的 12 字节按照如下方式生成:
二进制数据:是一个任意字节的字符串,不能直接在sell中使用;是将非UTF-8字符保存到数据库的唯一方式
代码
客户端
db
变量
- 启动时
shell
会连到MongoDB
服务器的test
数据库, 并将数据库连接赋值给全局变量db
; - 这个变量是通过
shell
访问MongoDB
的主要 入口点; - 查看 db 当前指向哪个数据库:
db
;
基本操作
- 创建:
db.posts.insert(post);
- 查找:
db.posts.find();
- 更新:
db.posts.update([限定条件], newpost)
; - 删除:
db.posts.remove(限定条件);
连接
- 启动
shell
时默认连接到test
数据库; - 启动
shell
时指定机器名和端口,就可以连接到一台不同的机器:$ mongo some-host:30000/myDB
; - 设置启动时不连接任何数据库:
$ mongo --nodb
; 之后可以再设置连接
> conn = new Mongo("some-host:30000")
connection to some-host:30000
> db = conn.getDB("myDB")
myDB
js脚本
使用MongoDB shell
执行js脚本;
- 直接在命令行中传递脚本,运行后退出;
$ mongo script1.js script2.js script3.js
- 可以指定的主机 / 端口上的
mongod
运行脚本,运行后退出;
$ mongo --quiet server-1:30000/foo script1.js script2.js script3.js
- 可以在脚本中使用
print()
函数将内容输出到标准输出; - 也可以使用
load()
函数,从交互式 shell 中运行脚本,运行后不退出:
> load("script1.js")
I am script1.js
>
- 使用js脚本初始化/辅助mongodb设定
// defineConnectTo.js
/**
* 连接到指定的数据库,并且将db指向这个连接 */
var connectTo = function(port, dbname) {
if (!port) {
port = 27017;
}
if (!dbname) {
dbname = "test";
}
db = connect("localhost:"+port+"/"+dbname);
return db; };
> load('defineConnectTo.js')
run方法
- 查找当前目录
run("pwd")
; - 行命令行程序:
run("ls", "-l", "/home/myUser/my-scripts/")
; - 通常来说,这种使用方式的局限性非常大,因为输出格式很奇怪,而且不支持管道。
.mongorc.js文件
- 这个文件会在启动
shell
时自动运行; - 位置在用户主目录;
- 启动时指定
--norc
参数,就可以禁止加载 ;
定制shell提示
- 设置
prompt
变量:
//显示操作时间
prompt = function() {
return (new Date())+"> ";
};
//显示当前数据库
prompt = function() {
if (typeof db == 'undefined') {
return '(nodb)> ';
}
// 检查最后的数据库操作
try {
db.runCommand({getLastError:1});
} catch (e) {
print(e);
}
return db+"> ";
};
编辑复合变量
> EDITOR="/usr/bin/vim"
> var wap = db.books.findOne({title: "War and Peace"})
> edit wap