MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表;而每个集合中可以存储一组由列标识的记录,列是可以自由定义的,非常灵活,由一组列标识的实体的集合对应于关系数据库表中的行。
一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中,因此可以存储比较复杂的数据类型。它是以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。Mongo还可以解决海量数据的查询效率,根据官方文档,当数据量达到50GB以上数据时,Mongo数据库访问速度是MySQL10 倍以上。
简单介绍一下MongoDB的shell命令:
(一)数据库操作基本命令
1、show dbs
显示当前数据库服务器上的数据库
2、use pagedb
切换到指定数据库pagedb的上下文,可以在此上下文中管理pagedb数据库以及其中的集合等
3、show collections
显示数据库中所有的集合(collection)
4、db.serverStatus()
查看数据库服务器的状态。
5、查询指定数据库统计信息
use fragment
db.stats()
6、查询指定数据库包含的集合名称列表
db.getCollectionNames()
7、创建数据库
在MongoDB中,可以直接通过use dbname来切换到这个数据库上下文下面,系统会自动延迟创建该数据库,例如:
> show dbs
local (empty)
pa_test 0.078125GB
mgt 0.078125GB
> use test
switched to db test
> db.user.save({'id':'999','name':'kk'})
> show dbs
local (empty)
pa_test 0.078125GB
test 0.078125GB
mgt 0.078125GB
>
指定要创建的数据库,并且向指定其中的一个集合并插入数据后,这样数据库和集合都被创建了。
8、删除数据库
直接使用db.dropDatabase()即可删除数据库。
(二)集合命令基本操作
1、创建集合
可以使用命令db.createCollection(name, { size : ..., capped : ..., max : ... } )创建集合
> db.createCollection('files', {'capped':true, 'size':10240, 'max':17855200})
{ "ok" : 1 }
> show collections
files
storeCollection
system.indexes
2、删除集合
删除集合,可以执行db.mycoll.drop()。
3、插入更新记录
直接使用集合的save方法
>db.storeCollection.save({'version':'3.5', 'segment':'e3ol6'})
更新记录,使用save会将原来的记录值进行覆盖实现记录更新。
4、查询一条记录
使用findOne()函数,参数为查询条件,可选,系统会随机查询获取到满足条件的一条记录(如果存在查询结果数量大于等于1)示例如下所示:
> db.storeCollection.findOne({'version':'3.5'})
{
"_id" : ObjectId("4ef970f23c1fc4613425accc"),
"version" : "3.5",
"segment" : "e3ol6"
}
5、查询多条记录
使用find()函数,参数指定查询条件,不指定条件则查询全部记录。
6、删除记录
使用集合的remove()方法,参数指定为查询条件,示例如下所示:
> db.storeCollection.remove({'version':'3.5'})
> db.storeCollection.findOne()
null
7、创建索引
可以使用集合的ensureIndex(keypattern[,options])方法,示例如下所示:
> use pagedb
switched to db pagedb
> db.page.ensureIndex({'title':1, 'url':-1})
> db.system.indexes.find()
{ "name" : "_id_", "ns" : "pagedb.page", "key" : { "_id" : 1 }, "v" : 0 }
{ "name" : "_id_", "ns" : "pagedb.system.users", "key" : { "_id" : 1 }, "v" : 0}
{ "_id" : ObjectId("4ef977633c1fc4613425accd"), "ns" : "pagedb.page", "key" : {"title" : 1, "url" : -1 }, "name" : "title_1_url_-1", "v" : 0 }
上述,ensureIndex方法参数中,数字1表示升序,-1表示降序。
使用db.system.indexes.find()可以查询全部索引。
8、查询索引
我们为集合建立的索引,那么可以通过集合的getIndexes()方法实现查询,示例如下所示:
> db.page.getIndexes()
[
{
"name" : "_id_",
"ns" : "pagedb.page",
"key" : {
"_id" : 1
},
"v" : 0
},
{
"_id" : ObjectId("4ef977633c1fc4613425accd"),
"ns" : "pagedb.page",
"key" : {
"title" : 1,
"url" : -1
},
"name" : "title_1_url_-1",
"v" : 0
}
]
当然,如果需要查询系统中全部的索引,可以使用db.system.indexes.find()函数。
9、删除索引
删除索引给出了两个方法:
db.mycoll.dropIndex(name)
db.mycoll.dropIndexes()
第一个通过指定索引名称,第二个删除指定集合的全部索引。
10、索引重建
可以通过集合的reIndex()方法进行索引的重建,示例如下所示:
> db.page.reIndex()
{
"nIndexesWas" : 2,
"msg" : "indexes dropped for collection",
"ok" : 1,
"nIndexes" : 2,
"indexes" : [
{
"name" : "_id_",
"ns" : "pagedb.page",
"key" : {
"_id" : 1
},
"v" : 0
},
{
"_id" : ObjectId("4ef977633c1fc4613425accd"),
"ns" : "pagedb.page",
"key" : {
"title" : 1,
"url" : -1
},
"name" : "title_1_url_-1",
"v" : 0
}
],
"ok" : 1
}
11、统计集合记录数
use fragment
db.baseSe.count()
统计结果,如下所示:
> use fragment
switched to db fragment
> db.baseSe.count()
36749
上述统计了数据库fragment的baseSe集合中记录数。
12、查询并统计结果记录数
use fragment
db.baseSe.find().count()
find()可以提供查询参数,然后查询并统计结果,如下所示:
> use fragment
switched to db fragment
> db.baseSe.find().count()
36749
上述执行先根据查询条件查询结果,然后统计了查询数据库fragment的baseSe结果记录集合中记录数。
13、查询指定数据库的集合当前可用的存储空间
use fragment
> db.baseSe.storageSize()
142564096
14、查询指定数据库的集合分配的存储空间
> db.baseSe.totalSize()
144096000
上述查询结果中,包括为集合(数据及其索引存储)分配的存储空间。