MongoDB是一个开源的,高性能,无模式(或者说是模式自由),使用C++语言编写的面向文档的数据库。正因为MongoDB是面向文档的,所以它可以管理类似JSON的文档集合。又因为数据可以被嵌套到复杂的体系中并保持可以查询可索引,这样一来,应用程序便可以以一种更加自然的方式来为数据建模。 MongoDB的特点:
1 统一的UTF-8编码
不是UTF-8编码集合的数据也可以通过使用一种特殊的二进制数据类型来保存,查询。
2 跨平台支持
二进制文件可以再Windows,Linux,OS X和Solaris平台上使用。MongoDB可以在大多数小端系统上编译通过。
3 支持丰富的类型
支持 dates, regular expressions, code, binary data 等类型
4 查询结果支持Cursor操作
5 支持Ad hoc queries(Ad hoc query:即席查询,数据库应用最普遍的一种查询,利用数据仓库技术,可以让用户随时可以面对数据库,获取所希望的数据。
在MongoDB中,可以在任何时候查询任何一个field。它支持 range queries,regular expression searches 和其他特殊的查询类型。同时查询也可以包含用户定义的javascript函数。
6 支持嵌套域的查询
查询可以深入到嵌套的对象和数组中,如果下面的对象被插入到users集合:
{
"username" : "bob",
"address" : {
"street" : "123 Main Street",
"city" : "Springfield",
"state" : "NY"
}
}
我们可以这样查询嵌套在里层的域
db.users.find({“address.state”:"NY”})
数组元素则可以被这样查询:
> db.food.insert({"fruit" : ["peach", "plum", "pear"]})
> db.food.find({"fruit" : "pear"})
7 支持索引
支持二级索引包括 single-key, compound, unique, non-unique, geospatial indexes.嵌套的域同样也可以被索引。如果我们对一个数组类型进行索引,那么数组中所有元素也会自动被索引。
当一个查询执行时,MongoDB的查询优化器会尝试多个不同的query plan,并选择执行速度最快的。开发者可以通过explain功能看到索引被使用的过程,然后可以通过hint功能来选择另一个不同的索引。
可以在任何时候创建和删除索引
8 aggregation
除了ad hoc queries外,MongoDB还支持一系列工具来支持聚合,例如MapReduce和其他类似于SQL的GROUP BY的函数集合。
9 文件存储
该软件实现了一个称为GridFS的协议,这个协议是用来帮助从数据库中存储和获取文件的。
10 支持服务器端javascript执行
javaScript是MongoDB的一种通用语言,它可以被用在查询,聚集函数,直接由数据库执行。
下面是一个使用javascript的查询例子:
db.foo.find({$where:function(){return this.x==this.y;}})
发送代码到数据库执行:
db.eval(function(name){return “Hello, ”+name;},[“Joe”])
javaScript的变量可以被存储在数据库中并被其他javas作为全局变量使用。任何合法的javascript类型包括函数和对象,都可以被存储在MongoDB中,所以javascript可以被用来写<存储过程>
11 capped collection
MongoDB支持被称为capped collections(定量集合)的定长集合。Capped collections是唯一一种维持插入顺序的集合,其中,如果达到容量最大值,那么就会覆盖第一个元素,也就是说capped collection的行为类似于一个环形队列。
一种特殊的cursor类型,称为tailable cursor,可以被用在capped collection上,当完成结果返回时,这种cursor不会关闭,而是会继续等待更多的结果来返回。也就是说如果有新的记录插入到capped collection的话,cursor会自动返回。
12 目前提供多种语言的driver
13 部署
MongoDB使用的是memory-mapped files(内存映射文件:A memory-mapped file is a segment of virtual memory which has been assigned a direct byte-for-byte correlation with some portion of a file or file-like resource. This resource is typically a file that is physically present on-disk, but can also be a device, shared memory object, or other resource that the operating system can reference through a file descriptor. Once present, this correlation between the file and the memory space permits applications to treat the mapped portion as if it were primary memory. ,在32位机器上限制数据的最大大小为2GB,同时MongoDB服务器只能在小端系统上运行。
14 Replication
MongoDB不应被部署到少于两台的服务器上,也就是说至少有一台作为master,另一台作为slave。Master可以用来执行读写,而slave可以从master上复制数据,但是它只能执行读操作或备份操作。开发者可以根据情况让一个operation可以被replicate到多个servers上。
下面的代码是启动一个master服务器和对应的slave服务器
$ mkdir –p ~/dbs/master ~/dbs/slave
$ ./mongod –master –port 10000 –dbpath ~/dbs/master
$ ./mongod –slave --port10001 –dbpath ~/dbs/slave -- source localhost:10000